#include<windows.h>
#define ID_TIMER 1001
#define ID_TIMER1 1002
#define WM_LDBCLk WM_USER +101
#define WM_LSNGCLK WM_USER +102
#define WM_RDBCLk WM_USER +103
#define WM_RSNGCLK WM_USER +104RECT CurRect,Oldrect,rcMergedRect;
POINT ptlTop,ptRBottom,OldCursorpos,NewCursorpos;
long movex,movey,rWide,rHeight;LRESULT CALLBACK WinProc(
 HWND hwnd, 
 UINT uMsg, 
 WPARAM wParam, 
 LPARAM lParam ); 
int WINAPI WinMain(
   HINSTANCE hInstance,     
   HINSTANCE hPrevInstance,  
   LPSTR lpCmdLine,         
   int nCmdShow              
   )
{
char lpszClassname[]="窗口";            
char lpszTitle[]="My_Windows";         
WNDCLASS wc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hInstance=hInstance;
wc.lpfnWndProc=WinProc;
wc.lpszClassName=lpszClassname;
wc.lpszMenuName=NULL;                              
wc.style=CS_HREDRAW|CS_VREDRAW; if(!RegisterClass(&wc))
{
MessageBeep(0);
return FALSE;
}

HWND hwnd;
hwnd=CreateWindow(lpszClassname,lpszTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,SW_SHOWNORMAL);     

UpdateWindow(hwnd);                 

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinProc(
 HWND hwnd, 
 UINT uMsg, 
 WPARAM wParam, 
 LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
static BOOL LDOWNFLAG,RDOWNFLAG,LUPSNGCLK,LUPDBCLK,LUP,KeyFLAG;
static BOOL DrawRectangle,DrawEllipse,DrawRoundRect,DrawLine;
static POINT pt,BeginPos,EndPos;
static BOOL operate=FALSE,ready=TRUE,ISSelected;
HBRUSH hBrush;
static RECT rect;
switch(uMsg)
{
case WM_KEYDOWN:
switch(wParam)
{
case 'Z':
KeyFLAG=TRUE;
break;
}
break;
case WM_LBUTTONDOWN:
if(!LDOWNFLAG)
{
LDOWNFLAG=TRUE;
SetTimer(hwnd,ID_TIMER,GetDoubleClickTime(),NULL);
}
else
{
LDOWNFLAG=FALSE;
PostMessage(hwnd,WM_LDBCLk,0,0);
}
        break;
case WM_LSNGCLK:
KillTimer(hwnd,ID_TIMER);
LUPSNGCLK=TRUE;
// DrawRectangle=TRUE;
    //  InvalidateRect(hwnd,NULL,1);
if(LUP)
{
PostMessage(hwnd,WM_LBUTTONUP,0,1);
}
GetClientRect(hwnd,&CurRect);
ptlTop.x=CurRect.left;
ptlTop.y=CurRect.top;
ptRBottom.x=CurRect.right;
ptRBottom.y=CurRect.bottom;
ClientToScreen(hwnd,&ptlTop);
ClientToScreen(hwnd,&ptRBottom);
SetRect(&CurRect,ptlTop.x,ptlTop.y,ptRBottom.x,ptRBottom.y);
ClipCursor(&CurRect);
GetCursorPos(&BeginPos);
ScreenToClient(hwnd,&BeginPos); 
if((!operate)&&ready)
{
operate=TRUE;
ready=FALSE;
SetCapture(hwnd);
    SetCursor(LoadCursor(NULL,IDC_CROSS));
}
    if(OldCursorpos.x>=rect.left&&OldCursorpos.x<=rect.right&& 
OldCursorpos.y<=rect.bottom&&OldCursorpos.y>=rect.top)
{
ISSelected=true;

break;
    case WM_LDBCLk:
KillTimer(hwnd,ID_TIMER);
LUPDBCLK=TRUE;
// DrawEllipse=~DrawEllipse;
     InvalidateRect(hwnd,NULL,1);
break;
case WM_LBUTTONUP:
if(LUPDBCLK)
{
LUPDBCLK=FALSE;
LUP=FALSE;
}
else
{
if(!LUPSNGCLK)
{
LUP=TRUE;
}
else
{
LUP=FALSE;
LUPSNGCLK=FALSE;
DrawRectangle=FALSE;
// InvalidateRect(hwnd,NULL,1);
}
}
if(operate)
{
operate=FALSE;
SetCursor(LoadCursor(NULL,IDC_WAIT));
GetClientRect(hwnd,&rect);
 //     InvalidateRect(hwnd,NULL,TRUE);
SetCursor(LoadCursor(NULL,IDC_ARROW));
ReleaseCapture();
   }
ready=TRUE;
ClipCursor(NULL);
ISSelected=FALSE;
break;
case WM_RBUTTONDOWN:
if(!RDOWNFLAG)
{
RDOWNFLAG=TRUE;
SetTimer(hwnd,ID_TIMER1,GetDoubleClickTime(),NULL);
}
else
{
RDOWNFLAG=FALSE;
PostMessage(hwnd,WM_RDBCLk,0,0);
}
break;
case WM_RSNGCLK:
KillTimer(hwnd,ID_TIMER1);
// DrawRoundRect=~DrawRoundRect;
//  InvalidateRect(hwnd,NULL,1);
break;
case WM_RDBCLk:
KillTimer(hwnd,ID_TIMER1);
// DrawLine=~DrawLine;
//  InvalidateRect(hwnd,NULL,1);
break;
case WM_TIMER:
switch(wParam)
{
case ID_TIMER:
LDOWNFLAG=FALSE;
PostMessage(hwnd,WM_LSNGCLK,0,0);
break;
case ID_TIMER1:
RDOWNFLAG=FALSE;
PostMessage(hwnd,WM_RSNGCLK,0,0);
break;
}
break;
case WM_MOUSEMOVE:
GetCursorPos(&EndPos);
ScreenToClient(hwnd,&EndPos);
if(operate)
{
rect.left=BeginPos.x<EndPos.x?BeginPos.x:EndPos.x;
rect.right=BeginPos.x>EndPos.x?BeginPos.x:EndPos.x;
rect.top=BeginPos.y<EndPos.y?BeginPos.y:EndPos.y;
rect.bottom=BeginPos.y>EndPos.y?BeginPos.y:EndPos.y;
InvalidateRect(hwnd,NULL,TRUE);
}
if(ISSelected)
{
GetCursorPos(&NewCursorpos);
ScreenToClient(hwnd,&NewCursorpos);
Oldrect=rect;
movex=NewCursorpos.x-OldCursorpos.x;
movey=NewCursorpos.y-OldCursorpos.y;
rect.left=rect.left+movex;
rect.bottom=rect.bottom+movey;
rect.right=rect.right+movex;
rect.top=rect.top+movey;
OldCursorpos=NewCursorpos;
rWide=rect.right-rect.left;
rHeight=rect.bottom-rect.top;
if (rect.left<CurRect.left)
{
rect.left=CurRect.left;
rect.right=CurRect.left+rWide;
}
if (rect.right>CurRect.right)
{
rect.right=CurRect.right;
rect.left=CurRect.right-rWide;
}
if (rect.top<CurRect.top)
{
rect.top=CurRect.top;
rect.bottom=CurRect.top+rHeight;
}
if (rect.bottom>CurRect.bottom)
{
rect.bottom=CurRect.bottom;
rect.top=CurRect.bottom-rHeight;

rcMergedRect.left=min(rect.left,Oldrect.left);
rcMergedRect.right=max(rect.right,Oldrect.right);
rcMergedRect.bottom=max(rect.bottom,Oldrect.bottom);
rcMergedRect.top=min(rect.top,Oldrect.top);
InvalidateRect(hwnd,&rcMergedRect,1);
UpdateWindow(hwnd);

break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
/* if(DrawRectangle)
{
hBrush=(HBRUSH)CreateSolidBrush(RGB(255,0,0));
SelectObject(hdc,hBrush);
Rectangle(hdc,30,50,100,200);
DeleteObject(hBrush);
}
if(DrawEllipse)
{
hBrush=(HBRUSH)CreateSolidBrush(RGB(0,255,0));
SelectObject(hdc,hBrush);
Ellipse(hdc,60,40,300,200);
DeleteObject(hBrush);
}
if(DrawRoundRect)
{
hBrush=(HBRUSH)CreateSolidBrush(RGB(0,0,255));
SelectObject(hdc,hBrush);
RoundRect(hdc,100,200,380,400,50,50);
DeleteObject(hBrush);
}
if(DrawLine)
{
hBrush=(HBRUSH)CreateSolidBrush(RGB(255,255,0));
SelectObject(hdc,hBrush);
MoveToEx(hdc,50,50,&pt);
LineTo(hdc,300,300);
DeleteObject(hBrush);
}*/
if(ready==FALSE&&KeyFLAG==TRUE)
{
hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH);
SelectObject(hdc,hBrush);
Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
DeleteObject(hBrush);
}
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
现在程序实现了,按下键盘上的Z键,单击鼠标左键移动可以画出一个矩形,想实现的是单击那个画出的矩形,移动鼠标可以拖动它,却怎么也移动不了,该怎么解决?