Программирование на C с помощью Windows API: как нарисовать командную кнопку - PullRequest
3 голосов
/ 11 апреля 2011

Что ж, я строю проект колледжа в C. GUI еще не учили, но я хочу, чтобы моя программа была лучше, поэтому я изучаю Windows API.

Я следую этому уроку здесь: http://www.winprog.org/tutorial/start.html, и это довольно хорошо. Это многое объясняет, но я не могу найти одну вещь (даже искал в Google, но все ориентировано на C ++ или C #):

Как нарисовать командную кнопку внутри нарисованного окна (которое я выучил) и как принять события для него?

Можете ли вы ответить или указать мне хорошую страницу, которая объясняет, как я могу создать командную кнопку, используя ТОЛЬКО Windows API и C. Пожалуйста, не C ++.

Спасибо за ваше время! :)

Ответы [ 2 ]

5 голосов
/ 11 апреля 2011

Это - учебник, который я настоятельно рекомендую по функциям интерфейса пользователя Win32 API. Это отлично Грубо говоря, в вашей функции обратного вызова (LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) у вас есть несколько опций, которые вы можете поймать:

switch(msg)  
{
    case WM_CREATE:
        break;

    case WM_COMMAND:
        break;
    /* .. */
}

То, что вам нужно сделать на WM_CREATE, выглядит примерно так:

HWND hWnd_button = CreateWindow(TEXT("button"), TEXT("Quit"),    
                 WS_VISIBLE | WS_CHILD ,
                 20, 50, 80, 25,        
                 hwnd, (HMENU) 1, NULL, NULL);  

Причина, по которой я сохранил HWND этой кнопки, заключается в том, что если вы хотите изменить кнопку позднее, вам понадобится этот дескриптор в качестве аргумента для SendMessage(). Теперь, следующий, ловить щелчок. Когда кнопка нажата, она отправляет WM_COMMAND в родительское окно с приведенным аргументом HMENU (в данном случае 1) в wParam. Это работает для каждого создаваемого вами элемента управления (меню, флажки и т. Д. - если они публикуют более сложные параметры, они могут присутствовать в lParam). Итак:

case WM_COMMAND:
    if (LOWORD(wParam) == 1) {
        DestroyWindow();
        /* or SendMessage(hwnd, WM_CLOSE,0,0); see commments */
    }
    break;

Ловит эту конкретную опцию. Внутри if обрабатывает это событие кнопки.

1 голос
/ 11 апреля 2011

Просто используйте CreateWindow с именем класса "BUTTON", style BS_PUSHBUTTON и родительским окном в качестве существующего нарисованного окна. Координаты x и y выбирают положение верхней левой кнопки в окне. Название окна - это текст на кнопке. Кроме того, не забудьте вызвать ShowWindow на возвращенном дескрипторе.

edit: чтобы принять события для него, сначала определите значение идентификатора, например:

#define ID_MYBUTTON 1

Затем передайте это в параметр меню вызова CreateWindow. В вашем главном окне сообщений proc теперь вы можете найти сообщение, проверив:

if(message == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == ID_MYBUTTON) { /* button was clicked */ }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...