У тебя все работает, вот прога, которую я сделал на своем компе.
Main.cpp//============================================================
// Name: Rulik
// Description :
//============================================================
//---------------------------------------------------------------------------
#include <windows.h>
#include <windowsx.h>
#include "Rulik.h"
//---------------------------------------------------------------------------
static HWND MainWindow;
char szAppName[] = "EscButtom";
char szTitle[] = "Return";
HWND ChWnd1;
HWND ChWnd2;
HINSTANCE hIn;
bool Register(HINSTANCE);
HWND Create(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int MaxX;
int MaxY;
RECT rect;
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE hInst,
HINSTANCE hPrevInst,
LPSTR CmdParam,
int nCmdShow)
{
MSG Msg;
hIn=hInst;
if (!Register(hInst))
return false;
MainWindow=Create(hInst,nCmdShow);
if (MainWindow==0)
return false;
while (GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
//---------------------------------------------------------------------------
bool Register(HINSTANCE hInst)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szAppName;
InitEditEx(hInst);
return (RegisterClass(&wc) !=0);
}
HWND Create(HINSTANCE hInst, int nCmdShow)
{
HWND hWindow = CreateWindow(szAppName, szTitle,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInst, NULL);
if (hWindow != NULL)
{
ShowWindow(hWindow, nCmdShow);
UpdateWindow(hWindow);
}
return hWindow;
}
void OnDestroy(HWND hwnd)
{
PostQuitMessage(0);
}
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{
ChWnd1= CreateWindow(chRulik, NULL,
WS_CHILD | WS_VISIBLE,
5, 5,
50, 50,
hwnd, NULL, hIn, NULL);
ChWnd2= CreateWindow(chRulik, NULL,
WS_CHILD | WS_VISIBLE,
60, 5,
50, 50,
hwnd, NULL, hIn, NULL);
return -1;
}
LRESULT CALLBACK WndProc(HWND hWindow, UINT Message,
WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
HANDLE_MSG(hWindow, WM_DESTROY, OnDestroy);
HANDLE_MSG(hWindow, WM_CREATE, OnCreate);
default:
return DefWindowProc(hWindow, Message, wParam, lParam);
}
}
//---------------------------------------------------------------------------
Rulik.h#ifndef RULIK_H
#define RULIK_H
ATOM InitEditEx(HINSTANCE hInstance);
const TCHAR chRulik[]="EditEx"; // The window class name
#endif
Rulik.cpp#include <windows.h>
#include "Rulik.h"
LRESULT CALLBACK EditExWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
unsigned char CursorType=1;
//==============================================================
ATOM InitEditEx(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style = CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) EditExWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = 0;
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) 1;
wc.lpszMenuName = 0;
wc.lpszClassName = chRulik;
return RegisterClass(&wc);
}
//==================================================
int WINAPI PaintEditExWindow(HWND hWnd)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rt;
hdc = BeginPaint(hWnd, &ps);
// GetWindowRect(hWnd, &rt);
GetClientRect(hWnd, &rt);
// DrawText(hdc, L"Test", _tcslen(L"Test"), &rt,DT_SINGLELINE | DT_VCENTER | DT_CENTER);
Rectangle(hdc,rt.left,rt.top,rt.right,rt.bottom);
switch (CursorType)
{
case 0:
Rectangle(hdc,10,10,20,20);
break;
case 1:
Ellipse(hdc,10,10,20,20);
break;
}
EndPaint(hWnd, &ps);
return 0;
}
//===============================================================
void CALLBACK CursorTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
switch (CursorType)
{
case 0:
CursorType=1;
break;
case 1:
CursorType=0;
break;
}
InvalidateRect(hwnd,NULL,FALSE);
}
//================================================
//
// FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK EditExWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// int wmId, wmEvent;
CREATESTRUCT *CS;
switch (message)
{
case WM_CREATE:
CS = new CREATESTRUCT;
memcpy(CS,(LPCREATESTRUCT) lParam,sizeof(CREATESTRUCT));
SetWindowLong(hWnd, GWL_USERDATA, (LONG) CS);
break;
case WM_LBUTTONDOWN:
if (GetFocus() != hWnd) SetFocus(hWnd);
break;
case WM_SETFOCUS:
SetTimer(hWnd,1,500,CursorTimer);
break;
case WM_KILLFOCUS:
KillTimer(hWnd,1);
break;
case WM_DESTROY:
CS= (CREATESTRUCT *) GetWindowLong(hWnd, GWL_USERDATA);
delete CS;
break;
case WM_PAINT:
PaintEditExWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
//================================================
Я сделал два окошка, и если поочередно по ним шелкать, фокус перемешается с одного в другой.