WinAPI nichts passiert, auf den button klicken
Meine Frage ist: unten In der C++ - code, warum ein Klick auf den button nichts tun, während es nennen soll MessageBox
aus WndProc1
?
P. S: Nach dem kompilieren, habe ich einige Fehler wie den folgenden:
"C:\Windows\SysWOW64\ntdll.dll", Can't find or open PDB file.
Code:
#include <Windows.h>
LRESULT CALLBACK WndProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
LONG WINAPI WndProc1(
_In_ HWND hwnd_button,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
//Точка входа в программу
int WINAPI WinMain
(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//Создаем класс окна
WNDCLASS WindowClass;
//Заполняем структуру
WindowClass.style = 0;
WindowClass.lpfnWndProc = (WNDPROC)WndProc;
WindowClass.cbClsExtra = 0;
WindowClass.cbWndExtra = 0;
WindowClass.hInstance = hInstance;
WindowClass.hIcon = LoadIcon(hInstance,
(LPCTSTR)IDI_APPLICATION);
WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WindowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
WindowClass.lpszMenuName = 0;
WindowClass.lpszClassName = TEXT("Class");
//Зарегистируем класс окна
RegisterClass(&WindowClass);
//Создаем переменную, в которой поместим идентификатор окна
HWND hWnd;
hWnd = CreateWindow(TEXT("Class"), TEXT("ClickTest"),
WS_OVERLAPPEDWINDOW, 0, 0, 500, 300, NULL, NULL, hInstance, NULL);
//Создаем кнопку
HWND hWnd_button;
hWnd_button = CreateWindow(TEXT("button"), TEXT("Click me"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 10, 80, 30, hWnd, (HMENU)10000, hInstance, NULL);
//показать окно
ShowWindow(hWnd, nCmdShow);
//обновить содержимое окна
UpdateWindow(hWnd);
//Создадим переменную для храненния сообщений
MSG msg;
//Создадим цикл обработки сообщений
while(GetMessage(&msg, NULL,0 ,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LONG WINAPI WndProc1(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
switch (Message){
case WM_COMMAND:
if(LOWORD(wparam)==10000)
{
MessageBox(hwnd, TEXT("Button Pressed"), TEXT(""), 0);
}
return 0;}}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT PS;
switch(message)
{
case WM_CREATE:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
BeginPaint(hWnd, &PS);
EndPaint(hWnd, &PS);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Funktioniert jetzt, soeben hinzugefügten button-Funktion als einer der Fälle zu WndProc
(WndProc1
gelöscht)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wparam, LPARAM lParam)
{
PAINTSTRUCT PS;
switch(message)
{
case WM_CREATE:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
BeginPaint(hWnd, &PS);
EndPaint(hWnd, &PS);
break;
case WM_COMMAND:
if(LOWORD(wparam)==10000)
{
MessageBox(hWnd, TEXT("Button Pressed"), TEXT(""), 0);
}
default:
return DefWindowProc(hWnd, message, wparam, lParam);
}
return 0;
}
Eine Letzte newbie-Frage: was ist der Unterschied zwischen LRESULT CALLBACK
und LONG WINAPI
dann?
- Ja tut mir Leid, ich dachte, der code ist nicht so groß (und ich nicht weiß wo der Fehler ist) und die Kommentare nicht so wichtig.
- Es ist ok, aber manchmal Benutzer könnte denken, dass die Kommentare relevant sind. Und kein problem, es ist nicht so ein großer code, aber es schien mir irgendwie, dass nicht alles, es hätte wirklich relevant für das problem, und es ist ein gutes Verhalten, um zu versuchen, die Vermeidung von irrelevanten code, weil die Nutzer vor Ort das problem einfacher. Froh, dass Sie eine Antwort gefunden 🙂
- Bezüglich Ihrer letzten Frage. Sie sind die gleichen.
LRESULT
undLONG
= lange es ist die Funktion Rückgabewert.CALLBACK
undWINAPI
= __stdcall ist ein calling convention.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie erwarten Sie
WndProc1
genannt zu werden? Es ist nicht assoziiert zu jedem Fenster Klasse... Sie haben, um die WM_COMMAND-innenWndProc
(Tasten, sowie andere Allgemeine Steuerelemente, Benachrichtigen Sie Ihre Eltern Ihrer Veranstaltungen überWM_COMMAND
).Tun, diese änderung auf
WndProc
:Fügte ich
WM_COMMAND
imswitch
/case
vonWndProc
.