Как нажать кнопку на API?
От: jeon  
Дата: 22.10.05 12:43
Оценка:
Привет. Хочу просто сделать форму с кнопкой и чтобы при нажатии на кнопку что-нить делалось (все равно что) на чистом API. Форму я сделал и могу обрабатывать сообщения которые в неё поступают, у меня при нажатии на кнопку левой или правой кнопкой меняется текст окна и если открыт «Блокнот», то меняется и текст его заголовка окна. Добавил и кнопку на форму, но вот как обрабатывать сообщения для кнопки я не догоню!!! Собственно вот и вопрос – как сделать обработчик для кнопки. Вот код, который у меня получился:

#include <windоws.h> 

LONG WINAPI WndProc(HWND,UINT,WPARAM,LPARAM); 

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 
{ 
  HWND hwnd,bhwnd; 
  MSG msg; 
  WNDCLASS w; 
  memset(&w,0,sizeof(WNDCLASS)); 
  w.style=NULL; 
  w.lpfnWndProc=WndProc; 
  w.hInstance=hInstance; 
  w.hbrbаскgrоund=(HBRUSH)COLOR_windоw; 
  w.lpszClassName="First"; 
  w.hCursor=LoadCursor(NULL, IDC_ARROW); 
  RegisterClass(&w); 
  hwnd=Createwindоw("First","fucking windоw",WS_OVERLAPPEDwindоw,1,1,500,400,NULL,NULL,hInstance,NULL); 
  bhwnd=Createwindоw("BUTTON","OK",WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,100,hwnd,NULL,NULL,NULL); 
  Showwindоw(hwnd,nShowCmd); 
  Updatewindоw(hwnd); 
  while(GetMessage(&msg,NULL,0,0)) 
  { 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
  } 
  return msg.wParam; 
} 


LONG WINAPI WndProc(HWND hwnd,UINT Message,WPARAM wparam,LPARAM lparam) 
{ 
  switch(Message) 
  { 
  case WM_DESTROY: 
    PostQuitMessage(0); 
    break; 
  case WM_LBUTTONDOWN: 
    SetwindоwText(hwnd,"not fucking windоw"); 
    break; 
  case WM_RBUTTONDOWN: 
    HWND hnd; 
    hnd=Findwindоw(NULL,"Áåçûìÿííûé - Áëîêíîò"); 
    SetwindоwText(hnd,"jeon's soft - notepad"); 
    SetwindоwText(hwnd,"its so scary in a world with peoples who are idiots"); 
    break; 
  default: 
    return DefwindоwProc(hwnd,Message,wparam,lparam); 
  } 
  return 0; 
}

22.10.05 17:03: Перенесено модератором из 'C/C++' — Odi$$ey
Код отформатирован и заключён в тэги [c]/[/c] — Кодт
Re: Как нажать кнопку на API?
От: dibil  
Дата: 22.10.05 14:03
Оценка:
Здравствуйте, jeon, Вы писали:

Избыточное цитирование покусано — Кодт

По моему — проще работать с диалоговыми окнами — или создать сразу или "натянуть" поверх формы. А там получать сообщения от кнопки очень просто
Re: Как нажать кнопку на API?
От: kero Россия  
Дата: 22.10.05 15:16
Оценка:
Здравствуйте, jeon, Вы писали:

J>Собственно вот и вопрос – как сделать обработчик для кнопки.


WM_BLIN_COMMAND
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: Как нажать кнопку на API?
От: Кодт Россия  
Дата: 22.10.05 18:07
Оценка:
Здравствуйте, jeon, Вы писали:

J>Привет. Хочу просто сделать форму с кнопкой и чтобы при нажатии на кнопку что-нить делалось (все равно что) на чистом API. Форму я сделал и могу обрабатывать сообщения которые в неё поступают, у меня при нажатии на кнопку левой или правой кнопкой меняется текст окна и если открыт «Блокнот», то меняется и текст его заголовка окна. Добавил и кнопку на форму, но вот как обрабатывать сообщения для кнопки я не догоню!!! Собственно вот и вопрос – как сделать обработчик для кнопки.


Кнопка посылает своему родителю нотификацию — WM_COMMAND.
LOWORD(wParam) — идентификатор кнопки (IDC_blablabla, то, что устанавливается/получается через Get/SetDlgCtrlID()),
lParam — hwnd кнопки.

Кстати, для твоей задачи больше подходит не простое окно, а диалог. Создавать его можно как из ресурса, так и вручную.
Перекуём баги на фичи!
Re[2]: Как нажать кнопку на API?
От: jeon  
Дата: 23.10.05 11:20
Оценка:
К>Кнопка посылает своему родителю нотификацию — WM_COMMAND.
К>LOWORD(wParam) — идентификатор кнопки (IDC_blablabla, то, что устанавливается/получается через Get/SetDlgCtrlID()),
К>lParam — hwnd кнопки.

К>Кстати, для твоей задачи больше подходит не простое окно, а диалог. Создавать его можно как из ресурса, так и вручную.



Спасибо, но не понятны некоторые детали. Что делать если две кнопки, при нажатии на любую из них происходит одно и то же действие. Чтобы определить какую кнопку я нажал, я сделал хэндлы (b1hwnd,b2hwnd) этих кнопок глобальными переменными. И при получении сообщения WM_COMMAND сверяю хандл кнопки с lparam, вот так:

case WM_COMMAND:
if((HWND) lparam==b1hwnd)SetWindowText(hwnd,"OK was clicked");
if((HWND) lparam==b2hwnd)SetWindowText(hwnd,"Cool was clicked");

Конечно всё работает, но мне что-то кажется что я слишком намутил, ведь наверняка есть какие-то стандартные методы? Или я ошибаюсь?
И непонятно ещё, что за IDC_blablabla и Get/SetDlgCtrlID(), в MSDN идут ссылки только на ATL и MFC(меня это не интересует). Как можно воспользоваться этим?
И ещё, при программировании на Delphi у кнопки есть не только метод onClick, но и какой кнопкой мыши я нажал и если просто провел мышкой над кнопкой. Как быть с этим?
И чем отличается простое окно от диалога? И как это реализовать в коде.

У-у-у-у, как же это всё сложно, а всякие Delphi и VB какая-то верхушка айсберга получается. Даже и подумать не мог, что всё так заморочено! J))))

Вот код, который получился:

#include <windows.h>

LONG WINAPI WndProc(HWND,UINT,WPARAM,LPARAM);
HWND b1hwnd,b2hwnd;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    HWND hwnd;
    MSG msg;
    WNDCLASS w;
    memset(&w,0,sizeof(WNDCLASS));
    w.style=NULL;
    w.lpfnWndProc=WndProc;
    w.hInstance=hInstance;
    w.hbrBackground=(HBRUSH)COLOR_WINDOW;
    w.lpszClassName="First";
    w.hCursor=LoadCursor(NULL, IDC_ARROW);
    RegisterClass(&w);
    hwnd=CreateWindow("First","fucking window",WS_OVERLAPPEDWINDOW,1,1,500,400,NULL,NULL,hInstance,NULL);
    b1hwnd=CreateWindow("BUTTON","OK",WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,10,10,100,100,hwnd,NULL,NULL,NULL);
    b2hwnd=CreateWindow("BUTTON","Cool",WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,110,110,100,100,hwnd,NULL,NULL,NULL);
    ShowWindow(hwnd,nShowCmd);
    UpdateWindow(hwnd);
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}


LONG WINAPI WndProc(HWND hwnd,UINT Message,WPARAM wparam,LPARAM lparam)
{
    switch(Message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_LBUTTONDOWN:
        SetWindowText(hwnd,"not fucking WINDOW");
        break;
    case WM_RBUTTONDOWN:
        HWND hnd;
        hnd=FindWindow(NULL,"Áåçûìÿííûé - Áëîêíîò");
        SetWindowText(hnd,"jeon's soft - notepad");
        SetWindowText(hwnd,"its so scary in a world with peoples who are idiots");
        break;
    case WM_COMMAND:
        if((HWND) lparam==b1hwnd)SetWindowText(hwnd,"OK was clicked");
        if((HWND) lparam==b2hwnd)SetWindowText(hwnd,"Cool was clicked");
    default:
        return DefWindowProc(hwnd,Message,wparam,lparam);
    }
    return 0;
}
Re[3]: Как нажать кнопку на API?
От: Кодт Россия  
Дата: 23.10.05 11:45
Оценка:
Здравствуйте, jeon, Вы писали:

<>
Стандартный способ — раздать этим кнопкам разные идентификаторы (SetDlgCtrlID) и анализировать LOWORD(wParam)
.....
case WM_COMMAND:
  switch(LOWORD(wParam))
  {
  case IDOK: // IDOK, IDCANCEL и т.п. - стандартные идентификаторы
    EndDialog(IDOK); // если у тебя не просто окно, а модальный диалог - то его закрывают вот так.
    break;
  case IDC_KILL_ME:
    SendMessage(hwnd, WM_DESTROY, 0, 0); // примерно так можно захлопнуть обычное окно (впрочем, не уверен)
    break;
  .....
  }
.....
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.