WIN32 API (без MFC)
Вот собственно очень маленькая программа выводящая сообщения о нажатиях клавиш в элемент окна.
1. Создаем окно в редакторе ресурсов (обзываем его например IDD_MAINWINDOW как в моем примере ниже.
2. Cоздаем в нем элемент StaticText IDC_KEYMSG (контрол тоесть)
#include "resource.h"
// Функция главного окна -----------------------------
BOOL CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// создаем наше окошко.
HWND hWnd= CreateDialog(hInstance,LPCTSTR(IDD_MAINWINDOW),0,WndProc);
ShowWindow(hWnd,SW_SHOW);
// Main message loop:--------------------
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if(msg.message==WM_CHAR){
msg.hwnd=hWnd;
DispatchMessage(&msg);}
//тут мы дублируем сообщения о нажатиях клавиш главному окну чтобы обработать их.
}
return (int) msg.wParam;
}
// собственно функция нашего окошка. К ней система обращается
//когда что-то происходит, тоесть нашему окошку приходит сообщение.
// вот эти сообщения мы и обрабатываем тут.
// в данном примере - когда поступает сообщение о нажатиях клавиши (WM_CHAR)
//мы выводим строку в элемент окна IDC_KEYMSG
//где пишем какая клавиша была нажата и даже ее код.
BOOL CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char keymessage[]="Клавиша - _ а ее код ___";
switch (message)
{
case WM_INITDIALOG: // такое сообщение приходит 1 раз после создания нашего окошка.
SetDlgItemText(hWnd,IDC_KEYMSG,(LPCTSTR)keymessage);
UpdateWindow(hWnd);
break;
case WM_CHAR: // если пришло такое сообщение значит нам сюда.
// wParam содержит код нажатого символа. Вставляем его в строку.
keymessage[10]=(BYTE)wParam;
// код символа также вставляем в строку
_itoa((BYTE)wParam,&keymessage[21],10);
//если двухзначный код затраем 3й символ
if ((BYTE)wParam < 100) keymessage[23]=0;
//если однозначный то затираем также 2ой
if ((BYTE)wParam < 10) keymessage[22]=0;
//выводим текст в элемент окна IDC_KEYMSG (static text)
SetDlgItemText(hWnd,IDC_KEYMSG,(LPCTSTR)keymessage);
break;
case WM_PAINT:
break;
case WM_CLOSE: // если окно пытаются закрыть - нам сюда.
DestroyWindow(hWnd);
PostQuitMessage(0);
break;
}
return false;
}
вот и все. Здоровый код без всяких хлопот. Я знаю все учебники по Winapi начинаются с CreateWindow
но помоему это просто лишнее забивание мозгов. Нет ничего такого чего нельзя было-бы сделать через диалоговое
окно. А гемора и кода куда меньше.
Единственное - понимание CreateWindow поможет лучше понять принципы... Просто чтобы новичка не запугал этот гемор с созданием окно сразу привел более компактное решение.
И нестандартный контрол ты тоже делаешь через диалоговое окно? :)
Ты про Custom Contol ? дык вроде он в редакторе тоже есть. Вообще таким не занимался пока. Но думаю можно скорее всего. Лазейка всегда найдется :) Получать хендлеры каждого элемента диалога можно.. и можно с ними работать так как если-бы ты создал через CreateWindow. Не пойму в чем проблема ? :) Можно впендюрить в диалоговое окно свой элемент на ходу в конце концов.
CreateDialog вызывает CreateWindowEx. ЕДИНСТВЕННОЕ различие только в том что вместо того чтобы ручками набивать элементы мы их красиво расставляем в редакторе. После чего CreateDialog передает эти параметры CreateWindow фукциям. После этого можно с окном работать точно так-же как если-бы создали через CreateWindowEx. Причем с элементами можно работать как через диалоговые функции (SendDlgItemMessage) так и через обычные, предварительно получив HWND нужного элемента функцией GetDlgItem. Со всеми вытекающими. Подмена процедуры итд. (если это требуется) SetWindowLongPtr(hWnd,GWLP_WNDPROC)
А интерфейс на базе одних диалогов - это убого и напоминает множество горе-интерфейсов клепаемых на Delphi и C++Builder.
А интерфейс на базе одних диалогов - это убого и напоминает множество горе-интерфейсов клепаемых на Delphi и C++Builder.
Ну пока на практике мне не пришлось извращатся с окнами... типа динамически создаваемый интерфейс и всякие там заморочки с контролами. я умею через CreateWindows делать но никогда не делаю - потому что через редактор ресурсов оно быстрее меньше писать и нагляднее... А какую-либо нестандартность я могу доделать в коде (при инциализации диалога прописываю все что мне нужно в разные контролы, чего не позволяет редактор). А то что CreateWindows полезно знать я упомянул. :) Я вот ща пытаюсь также научиться под MFC писать.. ну впринципе получается.. но блин привыкнуть сложно... Ну лан сорри за оффтоп :)