Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Кнопки


Автор: cupper 25.9.2008, 11:57
я уверен на 100% что вопрос глупый, но убейте некак немогу разобраться. 
Вот предположим мы создали окно c хенделом h1, и создали в нем кнопку с хенделом h2.
теперь я хочу чтоб когда я нажал на ету кнопку посреди (неважно где) окна вывелось например "hello wold". Я замучался ужи читать про все ето но все где я читаю нету явно написаного когда какже всетаки обработать ето гребаное нажиние кнопки.
Немоглибы вы написать прям мааненький кусочек кода именно уже пря в виде 
Код

case нажили кнопку:
     и вот мы ее обрабатваем
     и вызываем при нажитии етой кнопки какуюто функцию
braek;


и еще я хз как етот код бует выглядить, поетому сразу доспраша, если есть 2, 3, ... кнопок
с хенделами h2, h3, ...  как из полученного сообщения определить какую конпку мы нажали.
Ето бует по типу 
Код

case нажили кнопку:
     swith (msg.поле_передающее_значение_хендела)
          case h1: делаем тото; break;
          case h2: делаем чета другое; braek;
          ....
          default: а ета конпка пока необрабатываеться;
        
braek;


PS. сори за очепятки

Автор: 586 25.9.2008, 12:15
Код
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    LPCTSTR text;

    switch(uMsg)
    {
    // ....
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case ID_BUTTON1:
            text = _T("Hello world");

            hdc = GetDC(hWnd);
            TextOut(hdc, 5, 5, text, _tcslen(text));
            ReleaseDC(hWnd, hdc);
            break;
        }
        break;

    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}

Автор: mekhanikus 25.9.2008, 12:18
При создании кнопки присваиваешь ей идентификатор
(параметр окна - HMENU hMenu, // handle to menu or child-window identifier).

В WinProc родителя отлавливаешь WM_COMMAND, а в ней свой идентификатор.
Соответственно для разных кнопок будут разные иденты.

Автор: cupper 25.9.2008, 13:59
кланюсь вам в ноги ))

Автор: cupper 25.9.2008, 19:14
неработает !
а именно:
создаю конпку
Код

HMENU ID_Button1;
hButton = CreateWindow(
"button", 
"тыкни на меня", 
 WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
10, 10, 100, 30, // Ширина и высота окна
hWnd, // Хендл родительского окна
ID_Button1, 
hInst, 
NULL);

питыюсь обработать
Код

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ //wParam
        switch(msg){
                    case WM_COMMAND:
                         switch(LOWORD(wParam)){
                                                case ID_Button1:
                                                     /*text = _T("Hello world");
                                                     hdc = GetDC(hWnd);
                                                     TextOut(hdc, 5, 5, text, _tcslen(text));
                                                     ReleaseDC(hWnd, hdc);*/
                                                     //break;
                                                }
                         break;

и на виделенную строчку он мне жалуеться и пишет
Код

102 C:\Documents and Settings\Cupper\Мои документы\DEV-C++\WinAPI\Окно\main.cpp `ID_Button1' undeclared (first use this function) 

немоглибы пояснить почему ?

Автор: 586 25.9.2008, 19:46
Код
#include <windows.h>
#include <tchar.h>

#define ID_Button1   100     // идентификатор контрола - любое число, меньшее 65536

// ..............

hButton = CreateWindow(_T("button"),  _T("тыкни на меня"), 
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
       10, 10, 100, 30, // Ширина и высота окна
       hWnd, // Хендл родительского окна
       (HMENU)ID_Button1, 
       hInst, 
       NULL);

// ...............

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ //wParam
        switch(msg){
                    case WM_COMMAND:
                         switch(LOWORD(wParam)){
                                                case ID_Button1:
                                                     /*text = _T("Hello world");
                                                     hdc = GetDC(hWnd);
                                                     TextOut(hdc, 5, 5, text, _tcslen(text));
                                                     ReleaseDC(hWnd, hdc);*/
                                                     break;
                                                }
                         break;

Автор: cupper 26.9.2008, 09:43
аа, вон оно че, а я то идентификатор создавал типа передаваемого аргумента (( СПС

Автор: ProgramerKo 23.12.2008, 04:50
а как обработать нажатие кнопки в чужом приложении? smile 
Модератор: Пожалуйста, один топик - один вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)