A
C++:
#include <windows.h>
#include <string.h>
#include <stdio.h>
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WindowFunc2(HWND, UINT, WPARAM, LPARAM);
char szWinName[] = "MyWin";
char szWinName1[] = "MyWin";
char str[255] = "";
HWND hwnd;
HWND hwnd2;
int X=200, Y=200;
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{
MSG msg;
WNDCLASSEX wcl, wcl1;
wcl.hInstance = hThisInst;
wcl.lpszClassName = szWinName;
wcl.lpfnWndProc = WindowFunc;
wcl.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; // Двойной щелчек на WM_LBUTTONDOWN для родительского
wcl.cbSize = sizeof(WNDCLASSEX);
wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
wcl.lpszMenuName = NULL;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hbrBackground = CreateSolidBrush(RGB(0,40,40));
wcl1=wcl;
wcl1.lpszClassName = "1";
wcl1.lpfnWndProc = WindowFunc2;
wcl1.hbrBackground = CreateSolidBrush(RGB(133, 133, 133));
wcl1.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; // Двойной щелчек на WM_LBUTTONDOWN для дочернего
if (!RegisterClassEx(&wcl) | !RegisterClassEx(&wcl1)) return 0;
hwnd = CreateWindow(szWinName,
"API application",
WS_OVERLAPPEDWINDOW,
200,
200,
600,
620,
HWND_DESKTOP,
NULL,
hThisInst,
NULL,
);
hwnd2 = CreateWindow("1",
"API application",
WS_OVERLAPPEDWINDOW | WS_CHILD,
40,
40,
500,
500,
hwnd,
NULL,
hThisInst,
NULL
);
ShowWindow (hwnd, SW_SHOW);
ShowWindow (hwnd2, SW_HIDE);
ShowWindow(hwnd, nWinMode);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowFunc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (message)
{
case WM_CREATE:
SetTimer(hwnd , 0 , 3000 ,NULL); break;
case WM_TIMER:
ShowWindow(hwnd2,SW_SHOW); break;
case WM_CHAR: break;
case WM_LBUTTONDOWN: break;
case WM_KEYDOWN:
{
switch(HIWORD(lParam))
{
case 0x1D:
ShowWindow (hwnd, SW_SHOW);
MessageBox(hwnd,"Left CTRL","CTRL",MB_OK);
break;
case 0x11D:
ShowWindow (hwnd2, SW_SHOW);
MessageBox(hwnd2,"Right CTRL","CTRL",MB_OK);
break;
}
switch(wParam)
{
case VK_LEFT:
{
hdc = GetDC(hWnd);
X-=10;
MoveWindow(hwnd,X,Y,600,620,TRUE);
}
break;
case VK_RIGHT:
{
hdc = GetDC(hWnd);
X+=10;
MoveWindow(hwnd,X,Y,600,620,TRUE);
}
break;
case VK_UP:
{
hdc = GetDC(hWnd);
Y-=10;
MoveWindow(hwnd,X,Y,600,620,TRUE);
}
break;
case VK_DOWN:
{
hdc = GetDC(hWnd);
Y+=10;
MoveWindow(hwnd,X,Y,600,620,TRUE);
}
break;
}
break;
}
case WM_LBUTTONDBLCLK:
{
ShowWindow( hWnd, SW_SHOWMAXIMIZED);
UpdateWindow(hWnd);
return 0;
}
case WM_DESTROY:
if (hWnd == hwnd) PostQuitMessage(0); break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
LRESULT CALLBACK WindowFunc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (message)
{
case WM_CREATE:
SetTimer(hwnd , 0 , 3000 ,NULL); break;
case WM_CHAR: break;
case WM_LBUTTONDOWN: break;
case WM_KEYDOWN:
{
switch(wParam)
{
case VK_LEFT:
{
hdc = GetDC(hWnd);
X-=10;
MoveWindow(hwnd2,X,Y,600,620,TRUE);
}
break;
case VK_RIGHT:
{
hdc = GetDC(hWnd);
X+=10;
MoveWindow(hwnd2,X,Y,600,620,TRUE);
}
break;
case VK_UP:
{
hdc = GetDC(hWnd);
Y-=10;
MoveWindow(hwnd2,X,Y,600,620,TRUE);
}
break;
case VK_DOWN:
{
hdc = GetDC(hWnd);
Y+=10;
MoveWindow(hwnd2,X,Y,600,620,TRUE);
}
break;
}
break;
case WM_LBUTTONDBLCLK:
{
ShowWindow( hWnd, SW_SHOWMAXIMIZED);
UpdateWindow(hWnd);
return 0;
}
case WM_RBUTTONDOWN:
{
WORD xPos, yPos, nSize;
TCHAR szBuf[100];
// Сохраняем координаты курсора мыши
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
hdc = GetDC(hWnd);
// Подготавливаем текстовую строку, содержащую
// координаты курсора мыши
nSize = wsprintf(szBuf, TEXT("(%d, %d)"), xPos, yPos);
// Выводим координаты курсора мыши
// в точке, соответствующей положению
// курсора мыши
TextOut(hdc, xPos, yPos, szBuf, nSize);
ReleaseDC(hWnd, hdc);
return 0;
}
case WM_DESTROY:
if (hWnd == hwnd2) PostQuitMessage(0); break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
}