Привет. Хочу просто сделать форму с кнопкой и чтобы при нажатии на кнопку что-нить делалось (все равно что) на чистом 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] — Кодт
Здравствуйте, jeon, Вы писали:
Избыточное цитирование покусано — Кодт
По моему — проще работать с диалоговыми окнами — или создать сразу или "натянуть" поверх формы. А там получать сообщения от кнопки очень просто
К>Кнопка посылает своему родителю нотификацию — 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;
}
Здравствуйте, 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;
.....
}
.....