#include<windows.h>
#define ID_TIMER 1001
#define WM_LDBCLk WM_USER +101
#define WM_LSNGCLK WM_USER +102
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;
BOOL FLAG;
BOOL DrawRectangle=FALSE,DrawEllipse=FALSE;
switch(uMsg)
{
case WM_LBUTTONDOWN:
if(!FLAG)
{
FLAG=TRUE;
SetTimer(hwnd,ID_TIMER,GetDoubleClickTime(),NULL);
}
else
{
FLAG=FALSE;
PostMessage(hwnd,WM_LDBCLk,0,0);
}
break;
case WM_TIMER:
switch(wParam)
{
case ID_TIMER:
KillTimer(hwnd,ID_TIMER);
FLAG=FALSE;
PostMessage(hwnd,WM_LSNGCLK,0,0);
break;
}
break;
case WM_LSNGCLK:
DrawRectangle=TRUE;
InvalidateRect(hwnd,NULL,1);
break;
case WM_LDBCLk:
DrawEllipse=TRUE;
InvalidateRect(hwnd,NULL,1);
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
if(DrawRectangle)
{
Rectangle(hdc,100,200,500,900);
}
if(DrawEllipse)
{
Ellipse(hdc,30,500,90,800);
}
EndPaint(hwnd,&ps);
break; case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}程序的原意是单击鼠标左键画一个矩形,双击鼠标左键画一个椭圆,现在为什么实现不了,错在哪里了,我感觉逻辑思路应该没什么问题吧?
#define ID_TIMER 1001
#define WM_LDBCLk WM_USER +101
#define WM_LSNGCLK WM_USER +102
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;
BOOL FLAG;
BOOL DrawRectangle=FALSE,DrawEllipse=FALSE;
switch(uMsg)
{
case WM_LBUTTONDOWN:
if(!FLAG)
{
FLAG=TRUE;
SetTimer(hwnd,ID_TIMER,GetDoubleClickTime(),NULL);
}
else
{
FLAG=FALSE;
PostMessage(hwnd,WM_LDBCLk,0,0);
}
break;
case WM_TIMER:
switch(wParam)
{
case ID_TIMER:
KillTimer(hwnd,ID_TIMER);
FLAG=FALSE;
PostMessage(hwnd,WM_LSNGCLK,0,0);
break;
}
break;
case WM_LSNGCLK:
DrawRectangle=TRUE;
InvalidateRect(hwnd,NULL,1);
break;
case WM_LDBCLk:
DrawEllipse=TRUE;
InvalidateRect(hwnd,NULL,1);
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
if(DrawRectangle)
{
Rectangle(hdc,100,200,500,900);
}
if(DrawEllipse)
{
Ellipse(hdc,30,500,90,800);
}
EndPaint(hwnd,&ps);
break; case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}程序的原意是单击鼠标左键画一个矩形,双击鼠标左键画一个椭圆,现在为什么实现不了,错在哪里了,我感觉逻辑思路应该没什么问题吧?
再想想是不是刚画上,就被刷新掉了.因为你调用的InvalidateRect,这个函数发一个消息,有可能这个消息在你画图后才被响应.
下面先return 掉,
其他在帮你看看
1.图形画出界了
2.BOOL DrawRectangle=FALSE,DrawEllipse=FALSE;
BOOL FLAG;这个置为全局
#include<windows.h>
#define ID_TIMER 1001
#define WM_LDBCLk WM_USER +101
#define WM_LSNGCLK WM_USER +102
BOOL DrawRectangle=FALSE,DrawEllipse=FALSE;
BOOL FLAG;
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;
switch(uMsg)
{
case WM_LBUTTONDOWN:
{
if(!FLAG)
{
OutputDebugString(TEXT("run lbtn"));
FLAG=TRUE;
SetTimer(hwnd,ID_TIMER,GetDoubleClickTime(),NULL);
return 0;
}
else
{
FLAG=FALSE;
PostMessage(hwnd,WM_LDBCLk,0,0);
}
}break;
case WM_TIMER:
{
switch(wParam)
{
case ID_TIMER:
{
KillTimer(hwnd,ID_TIMER);
FLAG=FALSE;
PostMessage(hwnd,WM_LSNGCLK,0,0);
}break;
}
}break;
case WM_LSNGCLK:
{
DrawRectangle=TRUE;
InvalidateRect(hwnd,NULL,1);
}break;
case WM_LDBCLk:
{
DrawEllipse=TRUE;
InvalidateRect(hwnd,NULL,1);
}break;
case WM_PAINT:
{
hdc=BeginPaint(hwnd,&ps);
if(DrawRectangle)
{
Rectangle(hdc,400,300,100,100);
}
if(DrawEllipse)
{
Ellipse(hdc,30,50,200,120);
}
EndPaint(hwnd,&ps);
}break;
case WM_DESTROY:
{
PostQuitMessage(0);
}break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
特意帮你改了下缩进,下次注意点缩进哈。
另外依靠时间判别并不是好方法。你看看还有什么问题
{
switch(wParam)
{
case ID_TIMER:
{
KillTimer(hwnd,ID_TIMER);
if(FLAG)
{
PostMessage(hwnd,WM_LSNGCLK,0,0);
}
}break;
}
}break;
如果直接响应双击就是再窗口样式加上CS_DBCLICKS这个的话,你双击的时候连单击也响应了,根本区分不开的还有你用的什么编辑器啊,我用的这个vc++6.0和VISual Assist 代码缩进就是这样的,怎样才能像你的代码那样缩进
static BOOL DrawEllipse=FALSE;switch(...)
{
...
}
static BOOL FLAG=FALSE;
static BOOL DrawRectangle=FALSE;
static BOOL DrawEllipse=FALSE;switch(...)
{
...
}
LRESULT CALLBACK WinProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
switch(uMsg)
{
case WM_LBUTTONDOWN:
{
if(!FLAG)
{
FLAG=TRUE;
SetTimer(hwnd,ID_TIMER,GetDoubleClickTime()+100,NULL);
return 0;
}
else
{
FLAG=FALSE;
PostMessage(hwnd,WM_LDBCLk,0,0);
}
}break;
case WM_TIMER:
{
switch(wParam)
{
case ID_TIMER:
{
KillTimer(hwnd,ID_TIMER);
if(FLAG)
{
FLAG=FALSE;
PostMessage(hwnd,WM_LSNGCLK,0,0);
}
}break;
}
}break;
case WM_LSNGCLK:
{
DrawRectangle=TRUE;
InvalidateRect(hwnd,NULL,1);
}break;
case WM_LDBCLk:
{
DrawEllipse=TRUE;
InvalidateRect(hwnd,NULL,1);
}break;
case WM_PAINT:
{
hdc=BeginPaint(hwnd,&ps);
if(DrawRectangle)
{
Rectangle(hdc,400,300,100,100);
}
if(DrawEllipse)
{
Ellipse(hdc,30,50,200,120);
}
EndPaint(hwnd,&ps);
}break;
case WM_DESTROY:
{
PostQuitMessage(0);
}break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
=============================================================================
#include<windows.h>
#define ID_TIMER 1001
#define WM_LDBCLk WM_USER +101
#define WM_LSNGCLK WM_USER +102
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 FLAG;
static BOOL DrawRectangle,DrawEllipse;
switch(uMsg)
{
case WM_LBUTTONDOWN:
if(!FLAG)
{
FLAG=TRUE;
SetTimer(hwnd,ID_TIMER,GetDoubleClickTime(),NULL);
}
else
{
// KillTimer(hwnd,ID_TIMER);
FLAG=FALSE;
PostMessage(hwnd,WM_LDBCLk,0,0);
}
break;
case WM_TIMER:
switch(wParam)
{
case ID_TIMER:
// KillTimer(hwnd,ID_TIMER);
FLAG=FALSE;
PostMessage(hwnd,WM_LSNGCLK,0,0);
break;
}
break;
case WM_LSNGCLK:
{
KillTimer(hwnd,ID_TIMER);
DrawRectangle=~DrawRectangle;
InvalidateRect(hwnd,NULL,1);
}
break;
case WM_LDBCLk:
{
KillTimer(hwnd,ID_TIMER);
DrawEllipse=~DrawEllipse;
InvalidateRect(hwnd,NULL,1);
}
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
if(DrawRectangle)
{
Rectangle(hdc,30,50,100,200);
}
if(DrawEllipse)
{
Ellipse(hdc,60,40,300,200);
}
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}