
- •Int cbClsExtra;
- •Int cbWndExtra;
- •Создание и отображение окна
- •Int nWidth,
- •Int nHeight,
- •Оконная процедура
- •Int winapi MessageBox(
- •6) Дочернее окно может по своему дескриптору Chld получить дескриптор родительского окна при помощи функции:
- •8) При уничтожении родительского окна сообщение wm_destroy также рассылается всем дочерним окнам.
- •Параметры:
- •10) При уничтожении дочернего окна функцией DestroyWindow() родительскому окну тоже передается сообщение wm_destroy.
- •4) После того, как дочернее окно было создано, оно может посылать сообщение wm_command, уведомляющие pодительское окно об изменении своего состояния.
- •7) В программе функция InitStr() объявлена следующим образом:
- •Void InitStr(hwnd hWnd, char *s, int Max, char Sy);
- •Void InitStr(hwnd hWnd,char *s,int Max,char Sy)
- •11) Код функции обработки пароля приведён в листинге:
- •If(IsIconic(hwnd)) ShowWindow(hwnd,sw_restore);
- •If (!RegClass(WndProc,szMainClass,color_desktop))
If(IsIconic(hwnd)) ShowWindow(hwnd,sw_restore);
SW_RESTORE - активизирует и отображает окно. Если окно минимизировано или развернуто, Windows восстанавливает его в первоначальном размере и позиции (то же самое, что и SW_SHOWNORMAL).
Шаг 4)
Перемещаем окно первого экземпляра на передний план:
SetForegroundWindow(hwnd);
Затем второй экземпляр приложения завершает работу.
Шаг 5)
В случае, если предыдущий экземпляр приложения не найден, то регистрируем класс окна:
If (!RegClass(WndProc,szMainClass,color_desktop))
return FALSE;
Шаг 6)
Для создания максимально распахнутого окна приложения необходимо определить ширину и высоту экрана в пикселях:
int w=GetSystemMetrics(SM_CXSCREEN);
int h=GetSystemMetrics(SM_CYSCREEN);
Шаг 7)
Создаём окно:
Hwnd=CreateWindow(szMainClass,szTitle,WS_POPUPWINDOW|WS_CAPTION|WS_MINIMIZEBOX|WS_VISIBLE,0,0,w,h,0,0,hInstance,NULL);
Стиль WS_POPUPWINDOW|WS_CAPTION|WS_MINIMIZEBOX|WS_VISIBLE указывает на временное окно с кнопкой минимизации и заголовком.
Шаг 8)
Далее создаём цикл обработки сообщений приложения:
while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
Так как приложение не предусматривает обработки сообщений от клавиатуры, то в цикле отсутствует вызов функции трансляции клавиатурных сообщений.
Шаг 9)
Создаём оконную процедуру:
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{switch(msg)
{
case WM_DESTROY:
{PostQuitMessage(0); return 0;}
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}
______________________________________________________________
Листинг 1:
#include <windows.h>
#include<tchar.h> // for UNICODE charset
bool RegClass(WNDPROC,LPCTSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE hInstance;
TCHAR szMainClass[]=_T("MainClass");
TCHAR szTitle[]=_T("Пример 1.1");
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,
LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
hInstance=hInst;
HWND hwnd=FindWindow(szMainClass,szTitle);
if (hwnd)
{
MessageBox(hwnd,_T("Можно запускать только один экземпляр приложения!\n")
_T("Перемещаю на передний план первый экземпляр"),
szTitle,MB_OK|MB_ICONSTOP);
if (IsIconic(hwnd))
ShowWindow(hwnd,SW_RESTORE);
SetForegroundWindow(hwnd);
return 0;
}
if (!RegClass(WndProc,szMainClass,COLOR_DESKTOP))
return FALSE;
int w=GetSystemMetrics(SM_CXSCREEN)-1;
int h=GetSystemMetrics(SM_CYSCREEN)-1;
hwnd=CreateWindow(szMainClass,szTitle,WS_POPUPWINDOW|WS_CAPTION|
WS_MINIMIZEBOX|WS_VISIBLE,
0,0,w,h,0,0,hInstance,NULL);
if (!hwnd) return FALSE;
while (GetMessage(&msg,0,0,0))
DispatchMessage(&msg);
return msg.wParam;
}
bool RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground)
{
WNDCLASS wc;
wc.style=wc.cbClsExtra=wc.cbWndExtra=0;
wc.lpfnWndProc=Proc;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(brBackground+1);
wc.lpszMenuName=(LPCTSTR)NULL;
wc.lpszClassName=szName;
return (RegisterClass(&wc)!=0);
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{switch(msg)
{
case WM_DESTROY:
{PostQuitMessage(0); return 0;}
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}
Самостоятельно на практике: Приведенный код перевести на ассемблер.