Button erstellen auf WinApi
-
Hi,
ich hab im Internet und in der FoSu nicht dazu gefunden,
habt ihr vielleicht ein Beispiel wie ich den einbinden kann?#ich arbeite mit DevC++.
MfG
-
Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
jedes element ist ein fenster, wenn du dich damit abgefunden hast wirst du sehr schnell feststellen das
HWND button = ::CreateWindow(_T("button"), ...);
dir ein button handle liefert
-
Hast du vllt mal ein Beispiel für mich?
Hab mirmal ein wenig was zu CreateWindow angeschaut, steige da nur nicht wirklich durch.
-
ok
HWND button = ::CreateWindow(_T("button"), _T("Title"), WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_GROUP, 10, 10, 60, 20, hwndMainWnd, reinterpret_cast<HMENU>(static_cast<ULONG_PTR>(ID_BUTTON)), 0, 0); ::SendMessage(m_button , WM_SETFONT, reinterpret_cast<WPARAM>(GetStockObject(DEFAULT_GUI_FONT)), 0);
ich selber hatte damals alle winapi controls in klassen gekapselt mit eigenen bequemeren creates usw
-
Wenn ich ja nun bei DevC++ mir nen WinApi Prjekt mache, bekomme ich ja zunächst einen Generierten Code, wo muss ich diese Zeilen einfügen und welche Klassen muss ich noch deklarieren?
-
das kommt in die "OnCreate" message
schau dir am besten die basics zur windows programmierung durch www.winapi.net
oder hol dir den petzold
-
Siehst du unten das swith(message) ?
Da drüber definierst du erst mal die Variable für das kleine Window.
Das müsste dann so aussehen. Der name "hButton" ist variable und kann verändert werden :static HWND hButton; switch (message) { ...
Wenn du dann den Button erstellen möchtest, tust du das ein kleinwenig weiter unten, nämlich hier :
case WM_CREATE: //Wir erstellen etwas { hButton = CreateWindow( "button", //Name des Button's "Beenden", //Name der angezeigt wird WS_CHILD | WS_VISIBLE, //Es ist ein Child Fenster und soll Sichtbar sein 0, 0, 0, 0, //Position x,Position y,Größe x,Größe y hWnd, NULL, hInstance, NULL);
Das Code stück kannst du jetzt beliebig verändern.
Das heisst der ganze Code Abschnitt müsste so aussehen :static HWND hButton; switch (message) { case WM_CREATE: { hButton = CreateWindow( "button", "Beenden", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return 0; }
In der case WM_COMMAND kannst übrigens auch nachfragen ob der Button gedrückt wurde.
Das müsste so aussehen :case WM_COMMAND: { if (lParam == (LPARAM)hButton) //Wurde der Button names "hButton" gedrückt ? { MessageBox(NULL,"Sie haben hButton gedrückt !","Button wurde gedrückt",NULL); //Falls der Button gedrückt wurde starte diese Message auszugeben } return 0; }
Hoffe es hat dir geholfen und schöne Wheinachtszeit ! :xmas1: :xmas2:
{
-
Hat's geklappt ? :xmas2:
-
Erstmla danke für die Erklärung pivke,
ich habe mal probiert das einzufügen, hab oben drüber die Varible deklariert und in der switch Anweisung den Case eingefügt aber irgendwie kommen folgende Fehlerzeilen beim Compiler:
In function
LRESULT WindowProcedure(HWND__*, UINT, WPARAM, LPARAM)':
hWnd' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)
`hInstance' undeclared (first use this function)Und das in der Zeile
hButton = CreateWindow( "button", //Name des Button's
Woran kann das liegen?
-
Ich glaube dein Fehler liegt darin, das du in der LRESULT CALLBACK (...) das UINT falsch deklariert hast. Das heisst oben müsste es so aussehen :
LRESULT CALLBACK WndProc(HWND hWnd,UINT ->message<-,WPARAM wParam,LPARAM lParam)
Es ist nämlich Lebensnotwendig das das, was nach der UINT definiert wird auch in der Klammer nach der switch Anweisung kommt.
Das heisst es MUSS so aussehen :LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) {
Also meiner Meinung nach lag dein Fehler darin, das du die UNIT Anweisung falsch definiert hast oder halt die definierte Variable in die switch Abfrage gesetzt hast.
Hoffe du bekommst es hin:xmas1: :xmas2:
-
Das gehört mal in die FAQ.
#pragma comment(lib,"winmm.lib") #pragma comment(lib,"kernel32.lib") #pragma comment(lib,"user32.lib") #pragma comment(lib,"gdi32.lib") #pragma comment(lib,"winspool.lib") #pragma comment(lib,"shell32.lib") #include <windows.h> #include <tchar.h> HINSTANCE hInstance; LPWSTR lpTitle = _T("Beispiel"); LPWSTR lpClassName = _T("Beispielklasse"); LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam,HWND hButton); int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { MSG msg; WNDCLASSEXW mainclass; HWND hWnd; HWND hText; HWND hButton; mainclass.hIcon = NULL; mainclass.lpfnWndProc = (WNDPROC)WndProc; mainclass.hInstance = hInstance; mainclass.lpszClassName = lpClassName; mainclass.hCursor = 0; mainclass.cbSize = sizeof(WNDCLASSEX); mainclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); mainclass.style = CS_HREDRAW | CS_VREDRAW; mainclass.lpszMenuName = 0; mainclass.hIconSm = 0; mainclass.cbWndExtra = 0; mainclass.cbClsExtra = 0; RegisterClassExW(&mainclass); hWnd = CreateWindowW(lpClassName,lpTitle,WS_OVERLAPPEDWINDOW,40,40,400,400,NULL,NULL,hInstance,NULL); ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); hText = CreateWindowW(_T("STATIC"),_T("Welcome to the Beispielprogramm!"),WS_CHILD | WS_VISIBLE,120,0,120,30,hWnd,NULL,hInstance,NULL); ShowWindow(hText, nCmdShow); UpdateWindow(hText); hButton = CreateWindowW(_T("BUTTON"),_T("START BEISPIELPROGRAMM"),WS_CHILD | WS_VISIBLE,120,120,70,30,hWnd,NULL,hInstance,NULL); ShowWindow(hButton, nCmdShow); UpdateWindow(hButton); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return FALSE; } LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam,HWND hButton) { int i(0); switch(msg) { case WM_COMMAND: break; case WM_CREATE: break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; }
Ich hoffe das war hilfreich.