#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;
}程序的原意是单击鼠标左键画一个矩形,双击鼠标左键画一个椭圆,现在为什么实现不了,错在哪里了,我感觉逻辑思路应该没什么问题吧?

解决方案 »

  1.   

    先跟踪下你程序执行流程有没有按你的想法去执行,
    再想想是不是刚画上,就被刷新掉了.因为你调用的InvalidateRect,这个函数发一个消息,有可能这个消息在你画图后才被响应.
      

  2.   

    SetTimer(hwnd,ID_TIMER,GetDoubleClickTime(),NULL);
    下面先return 掉,
    其他在帮你看看
      

  3.   

    帮你改了下代码,以下几个问题:
    1.图形画出界了
    2.BOOL DrawRectangle=FALSE,DrawEllipse=FALSE;
    BOOL FLAG;这个置为全局
      

  4.   


    #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;
    }
    特意帮你改了下缩进,下次注意点缩进哈。
    另外依靠时间判别并不是好方法。你看看还有什么问题
      

  5.   

    看起来 我的思路什么的都没错,就是那几个BOOL型变量的地方定义错了 能不能给我解释下 为什么会出现这种错误
      

  6.   

    wm_timer改下 case WM_TIMER:
    {
    switch(wParam)
    {
    case ID_TIMER:
    {
    KillTimer(hwnd,ID_TIMER);
    if(FLAG)
    {
    PostMessage(hwnd,WM_LSNGCLK,0,0);
    }
    }break;
    }
    }break;
      

  7.   

    这个不对的 ,你调试下,如果这样的话你单击一下,画出一个矩形,然后双击才画椭圆,但是单击就画椭圆了,
    如果直接响应双击就是再窗口样式加上CS_DBCLICKS这个的话,你双击的时候连单击也响应了,根本区分不开的还有你用的什么编辑器啊,我用的这个vc++6.0和VISual Assist 代码缩进就是这样的,怎样才能像你的代码那样缩进
      

  8.   

    LZ这种实现方式很罕见啊,为什么要用WM_TIMER呢?如果一定要用这种方法,代码中应做的修改如下:static BOOL DrawRectangle=FALSE; 
    static BOOL DrawEllipse=FALSE;switch(...)
    {
    ...
    }
      

  9.   

    LZ这种实现方式很罕见啊,为什么要用WM_TIMER呢?如果一定要用这种方法,代码中应做的修改如下:
    static BOOL FLAG=FALSE;
    static BOOL DrawRectangle=FALSE;  
    static BOOL DrawEllipse=FALSE;switch(...)
    {
    ...
    }
      

  10.   

    呵呵 我也不知道老师为什么一定要用这种方法的 直接在窗口上加上双击风格就行了 老师讲的就是这样,本来觉得自己的API学的还行,听他一讲,(实际上他也没讲,就是给了个代码,)我觉得我自己连API是什么都分不清了 呵呵
      

  11.   


    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;
    }
      

  12.   

    回复内容下有个插入源代码    [ code = C/C++]  在这之间插入  [ / code]
      

  13.   

    好了终于实现了,又增加了好多新的知识,谢谢你的帮忙了。我把最后实现的代码共享下,再次谢谢了
    =============================================================================
    #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;
    }