עבור לתוכן

בעיה עם GUI בסיסי ב-CPP

Featured Replies

פורסם

שלום,

ניסיתי לבנות תוכנית בסיסית עם GUI של Hello World ב-CPP על בסיסי המאמר הנ"ל:

http://www.cprogramming.com/tutorial/opengl_first_windows_app.html

אני משתמש ב-Dev-C++ וכשאני מנסה להדר הוא אומר שהוא לא מוצא את הקובץ stdafx.h.

הבנתי שהקובץ הזה שייך ל-Visual Studio, האם יש דרך להשתמש בקובץ אחר במקום זה עם אותו קוד או שאני צריך לכתוב קוד שונה?

ואם אפשר אז אני אשמח גם לקבל לינקים ללמידת GUI ב-CPP ללא VS.

תודה מראש!

נ.ב.

הקוד בדיוק כמו בלינק אבל אם למישהו אין כוח להכנס אז הנה הקוד:


/* Trim fat from windows*/
#define WIN32_LEAN_AND_MEAN
#pragma comment(linker, "/subsystem:windows")
/* Pre-Processor directives*/
#include "stdafx.h"
#include <windows.h>
/* Windows Procedure Event Handler*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT paintStruct;
/* Device Context*/
HDC hDC;
/* Text for display*/
char string[] = "Hello, World!";
/* Switch message, condition that is met will execute*/
switch(message)
{
/* Window is being created*/
case WM_CREATE:
return 0;
break;
/* Window is closing*/
case WM_CLOSE:
PostQuitMessage(0);
return 0;
break;
/* Window neeeds update*/
case WM_PAINT:
hDC = BeginPaint(hwnd, &paintStruct);
/* Set txt color to blue*/
SetTextColor(hDC, COLORREF(0x00FF0000));
/* Display text in middle of window*/
TextOut(hDC,150,150,string,sizeof(string)-1);
EndPaint(hwnd, &paintStruct);
return 0;
break;
default:
break;
}
return (DefWindowProc(hwnd,message,wParam,lParam));
}

/* Main function*/
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX windowClass; //window class
HWND hwnd; //window handle
MSG msg; //message
bool done; //flag saying when app is complete

/* Fill out the window class structure*/
windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.style = CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = WndProc;
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = hInstance;
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
windowClass.lpszMenuName = NULL;
windowClass.lpszClassName = "MyClass";
windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

/* register window class*/
if (!RegisterClassEx(&windowClass))
return 0;

/* Class registerd, so now create window*/
hwnd = CreateWindowEx(NULL, //extend style
"MyClass", //class name
"A Real Win App", //app name
WS_OVERLAPPEDWINDOW | //window style
WS_VISIBLE |
WS_SYSMENU,
100,100, //x/y coords
400,400, //width,height
NULL, //handle to parent
NULL, //handle to menu
hInstance, //applcation instance
NULL); //no extra parameter's

/* Check if window creation failed*/
if (!hwnd)
return 0;

done = false; //initialize loop condition variable
/* main message loop*/
while (!done)
{
PeekMessage(&msg,hwnd,NULL,NULL,PM_REMOVE);
if (msg.message == WM_QUIT) //check for a quit message
done = true; //if found, quit app
else
{
// Translate and dispatch to event queue*/
TranslateMessage(&msg);
DisplatchMessage(&msg);
}
}
return msg.wParam;
}

פורסם

זה כל מה שמכיל stdafx:

#pragma once

#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif

#include <stdio.h>
#include <tchar.h>

אתה ככל הנראה לא צריך אותו בכלל.

חוץ מזה, למה לך ללמוד Windows API? זה אחד הדברים היותר מיושנים ומגעילים.

עדיף שתנסה להשתמש בחבילות יותר מתקדמות (כגון MFC) או שבכלל תלמד שפה שבה הרבה יותר נוח לעבוד עם GUI (כמו #C).

פורסם

stdafx הוא קובץ יחודי ל-visual studio, עד כמה שאני יודע. כנ"ל #pragma once.

כנראה שיש לך אוסף קבצים שמיועדים ל-visual studio ולא יעבדו על dev-c++ (שהוא בגדול מבוסס gcc) בלי שינויים.

קח בשחשבון כל מה שאמרתי יכול להיות שגוי במקרה שלך, אבל זה הניחוש הראשון שלי.

פורסם
  • מחבר

זה כל מה שמכיל stdafx:

#pragma once

#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif

#include <stdio.h>
#include <tchar.h>

אתה ככל הנראה לא צריך אותו בכלל.

חוץ מזה, למה לך ללמוד Windows API? זה אחד הדברים היותר מיושנים ומגעילים.

עדיף שתנסה להשתמש בחבילות יותר מתקדמות (כגון MFC) או שבכלל תלמד שפה שבה הרבה יותר נוח לעבוד עם GUI (כמו #C).

אז מה בעצם אני אעשה עם מה שלמדתי ב-CPP? סתם הולך לפח ועכשיו אני צריך ללמוד C# מההתחלה?

מה רע ב-GUI שב-CPP?

פורסם

אז מה בעצם אני אעשה עם מה שלמדתי ב-CPP? סתם הולך לפח ועכשיו אני צריך ללמוד C# מההתחלה?

מה רע ב-GUI שב-CPP?

לא רע, זה פשוט סיוט. הרבה דברים ניסיתי ללמוד רובם הבנתי מפעם שנייה/שלישית ואת WIN API לא הבנתי עדיין. עם כל הכבוד למיקרוסופט ולפשוט שאליה הם מנסים להגיע אבל WIN API SUX.

מי אמר לזרוק לפח? לדעתך CPP זה רק לשימוש ב WIN API? לא צריך לזרוק כלום לפח. לא צריך להיתעסק עם WIN API ו MFC לדעתי האישית. עדיף לנסות ספריות כמו WxWidgets או GTK(נראה לי שהוא גם לחלונות). תריץ חיפוש בגוגל ותגלה עד מה פשוטים יכולים להיות הדברים.

פורסם

בלי שום קשר ל-Win API או ל-MFC, מה שיש לך שם זה קובץ שמכיל דברים שמתאימים רק לקומפיילר ספציפי, וכנראה בכלל לא נחוצים.

אני מציע לך למצוא שלד של תוכנית ריקה ב-nehe או באתר של SDL.

פורסם
  • מחבר

אם כבר הגענו לנושא הזה אז, למה בעיקר משמשת CPP?

אחרי שלמדתי את הבסיס של השפה לאיזה תחומים אני יכול להמשיך כרגע?

כי אני פשוט חשבתי להמשיך לכיוון של תוכנות ומשחקים אז הלכתי על GUI..

פורסם

השאלה של "למה משמשת ++C" נשאלה עשרות פעמים בפורום.

בגדול, משתמשים בשפות low level כמו ++C/C כשאתה צריך לעבוד ברמת מערכת ההפעלה (לדוגמה אם אתה כותב דרייוורים, לדוגמה) או אם אתה צריך לכתוב קוד מאוד יעיל (אם אתה כותב מערכות real time, או מתכנת משחקים שמצריכים אלגוריתמים כבדים).

בהרבה מקרים כותבים תוכנה שהמנוע שלה ב-++C, וממשק המשתמש שלה (או ממשקים אחרים) כתובים בשפות יותר high level כמו ג'אווה או #C.

פורסם

אם כבר הגענו לנושא הזה אז, למה בעיקר משמשת CPP?

אחרי שלמדתי את הבסיס של השפה לאיזה תחומים אני יכול להמשיך כרגע?

כי אני פשוט חשבתי להמשיך לכיוון של תוכנות ומשחקים אז הלכתי על GUI..

בתיכנות משחקים ה GUI ממומש בכלל בצורה אחרת. אתה לא משתמש בחלונות של מערכת הפעלה אתה כותב משלך/משתמש בספריות מוכנות, שהמטרה שלהם היא ליצור כפתורים על ידי ציור קווים הדפס טקסטים.

פורסם
  • מחבר

אני יודע פיזיקה ברמה די גבוהה והייתי רוצה להמשיך לכיוון של בניית מנוע גרפי או פיזיקלי. ברור לי שזה דבר מאוד מסובך שלוקח המון זמן ואני גם לא אגיע למנוע ברמה גבוהה במיוחד אבל זה מה שמעניין אותי.

מאיפה למעשה אני מתחיל כרגע לאחר שאני יודע את הבסיס של CPP?

פורסם

יש איפה שהוא הסבר של איזה אדם אחד שקוראים לו Ninja משהוא, הוא מציג יפה מאוד את הרעיון של "בניית מנוע", לא מצליח למצוא עכשיו.

בהתחלה כשנכנסתי לתחום המשחקים (כרגע אני נמצא כ שנה וחצי בתחום) גם רציתי לבנות "מנוע". לא יודע ההגדרה של "מנוע" היא לא נכונה, ישר קופץ לראש תמונה של מנוע ממכונית => שמכונית בלי מנוע לא תעבוד. ואז תנקלתי במדריך של ההוא שהזכרתי למעלה, הוא אמר בדיוק את מה שאמרתי עכשיו והוסיף "אם אתה רוצה לבנות משחקים, תבנה משחקים". ובתכלס שים לב קודם היה Unreal Tournament אחרי זה הופיע מנוע Unreal. קודם היה HL אחרי זה פותח המנוע VALVE (עד כמה שידוע לי) שעליו מבוססים כל המשחקים כמו CS, DOD וכו'.

למה אני אומר את זה? תכלס לא אכפת לי אתה יכול לבנות מנוע, דיי בטוח שתצבור ידע הן באספקטים של OOP ושפת תיכנות שבה תבנה והן באספקטים של גרפיקיה/פיזיקה, אבל סביר להניח שתיכשל. השאלה האם הכשלון יהיה שווה את זה? נצא מהנחה שתצליח לבנות אחד אבל לא תוכל להריץ עליו כלום (מניסיון).

תחליט מה אתה רוצה באמת לבנות משחק או לבנות מנוע? סביר להניח שגם בניית משחק ילווה בכשלון בסוף אבל אתה תיצבור ידע, לדעתי האישית הרבה יותר שימושי מידע שתצבור מבניית מנוע עם המטרה שלך זה לבנות משחק.

מאיפה להתחיל? אין מדריך שמסביר מ A עד Z איך לבנות מנוע, כמו כן גם אין מדריך שמסביר מא' ועד ת' איך לבנות משחק. תתחליט במה אתה רוצה להיתמקד, משחקים זה תחום גדול, אמרת יש לך ידע בפיזיקה אולי הצד שתרצה לקחת בפיתוח משחקים הוא אכן מידול פיזיקיה, ואולי תעדיף תיכנות כללי, או תמכנת גראפי, משחק זה שם כולל להרבה אנשים אם ידע שונה.

טוב חפרתי מספיק, תבחר נושא או שתיים שעליהם תרצה להיתמקד ומשם אוכל לכוון אותך יותר.

כמו כן יש את www.gamedev.net (שכרגע ב maintenance)[מקווה שמותר לפרסם פורום אחר, אם לא מצטער מראש נא למחוק] זה פורטל ופורום לכל דבר, יש שם אלף ואחד מדריכים על כל הנושאים החל מתיכנות רגיל ועד לבינה מלכותית, מדריכים ב 2/3D גרפיקה, פזיקיה, מטמטיקה, רשתות, אבטחת מידע וכמובן פורומים לתמיכה בכל אחד מהנושאים.

עריכה: הנא המאמר

http://scientificninja.com/advice/write-games-not-engines

פורסם

תחפש את simple directmedia layer או בשמה האחר libsdl. זו נקודת התחלה אפשרית.

[br]פורסם בתאריך: 11.01.2008 בשעה 17:10:34


מלבנות מנוע פיסיקלי (למעשה כל מערכת קצת מסובכת), גם אם הוא כושל, אתה תלמד הרבה מאוד. כן, לא תוכל (לפחות לא בהתחלה) להדביק מנועים קיימים, אבל זו לא סיבה לא לעשות את זה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים