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 und LONG = lange es ist die Funktion Rückgabewert. CALLBACK und WINAPI = __stdcall ist ein calling convention.
InformationsquelleAutor Max Yari | 2013-03-10
Schreibe einen Kommentar