按课本编写了一个复选框程序,效果是点椭圆复选框画一个椭圆,点矩形复选框画一个矩形,程序虽然运行成功,但效果却出不来,具体程序如下,你可以直接把我的程序直接COPY到visul c++里面,看看效果,问题究竟出在哪里,先谢谢了!!!
/* Note:Your choice is Windows C IDE */
#include <windows.h>HINSTANCE hCurInst;long FAR PASCAL _WndFun(HWND,UINT,WPARAM,LPARAM);  //窗口处理函数int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPreInst,LPSTR lpCmd, int nStyle)

static char Name[]="CHECKEX"; //窗口类名
HWND  hWnd; //窗口句柄
MSG  msg; //Winddows消息
WNDCLASS   wc; //窗口类
hCurInst=hInst;
if(!hPreInst)
{
wc.lpszClassName =Name; //窗口类名为“示例”
wc.hInstance =hInst; //当前实例句柄
wc.lpfnWndProc =_WndFun; //窗口处理函数为WndProc
wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为默认图标
wc.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口采用箭头光标
wc.lpszMenuName =NULL; //窗口无菜单
wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景为白色
wc.style  =CS_HREDRAW|CS_VREDRAW;//窗口类型
wc.cbClsExtra =0; //窗口类无扩展
wc.cbWndExtra =0; //窗口实例无扩展


RegisterClass(&wc);//注册
}
hWnd=CreateWindow( Name,//窗口类名
                   Name,//窗口标题名
                   WS_OVERLAPPEDWINDOW,//窗口的风格
                   300,
                   200, //窗口左上角坐标为默认值
                   400,
                   200, //窗口的高和宽为默认值
                   NULL, //此窗口无父窗口
                   NULL, //此窗口无主菜单
                   hInst,
                   NULL);

ShowWindow(hWnd,nStyle);
UpdateWindow(hWnd);


while(GetMessage(&msg,NULL,0,0))    //消息循环
{   
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}
long FAR PASCAL _WndFun(HWND hWnd,UINT mes,WPARAM wParam,LPARAM lParam)
{
static HWND hCir,hSqr,hBrsh;
RECT w;
HDC hdc;
static int xc,yc;
PAINTSTRUCT ps;
UINT nc;
switch(mes)
{
   case WM_CREATE:
   GetClientRect(hWnd,&w);
   //建立椭圆的复选框
   hCir=CreateWindow("BUTTON","椭圆",BS_CHECKBOX|WS_CHILD|WS_VISIBLE,
                  w.left+50,w.bottom-80,80,25,hWnd,(HMENU)0,hCurInst,0);
   //建立矩形的复选框
   hCir=CreateWindow("BUTTON","矩形",BS_CHECKBOX|WS_CHILD|WS_VISIBLE,
                  w.left+50,w.bottom-50,80,25,hWnd,(HMENU)1,hCurInst,0);
   return 0;    case WM_COMMAND:
   if((HWND)lParam==hCir)
   {
   //读取圆的复选框状态
   nc=(WORD)SendMessage(hCir,BM_GETCHECK,0,0L);
   if(nc==TRUE) SendMessage(hCir,BM_SETCHECK,0,0L);
   else SendMessage(hCir,BM_SETCHECK,1,0L);
   }
   else if((HWND)lParam==hSqr)
   {
   nc=(WORD)SendMessage(hSqr,BM_GETCHECK,0,0L);
   if(nc==TRUE) SendMessage(hSqr,BM_SETCHECK,0,0L);
   else SendMessage(hSqr,BM_SETCHECK,1,0L);
   }
   InvalidateRect(hWnd,0,TRUE);
   return 0;
   case WM_SIZE:
   xc=LOWORD(lParam)/2;
   yc=HIWORD(lParam)/2;    return 0;
   case WM_PAINT:
   hdc=BeginPaint(hWnd,&ps);
   nc=(WORD)SendMessage(hCir,BM_GETCHECK,0,0L);  //检查椭圆的复选框
   if(nc==TRUE) Ellipse(hdc,xc-40,yc-60,xc+80,yc+60);
   nc=(WORD)SendMessage(hSqr,BM_GETCHECK,0,0L);  //检查矩形的复选框
   hBrsh=(HWND)GetStockObject(NULL_BRUSH);     //选择空填充
   SelectObject(hdc,hBrsh);
   if(nc) Rectangle(hdc,xc-40,yc-60,xc+80,yc+60);
   EndPaint(hWnd,&ps);    return 0;
   case WM_DESTROY:
   PostQuitMessage(0); //释放所建窗口    return 0;
   default:       ////执行其他情况
   return DefWindowProc(hWnd,mes,wParam,lParam);
}
}

解决方案 »

  1.   


    ...
    ------/* Note:Your choice is Windows C IDE */
    #include <windows.h>HINSTANCE hCurInst;long FAR PASCAL _WndFun(HWND,UINT,WPARAM,LPARAM);  //窗口处理函数int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPreInst,LPSTR lpCmd, int nStyle)

    static char Name[]="CHECKEX";//窗口类名
    HWND hWnd;//窗口句柄
    MSG msg;//Winddows消息
    WNDCLASS   wc;//窗口类
    hCurInst=hInst;
    if(!hPreInst)
    {
    wc.lpszClassName =Name;//窗口类名为“示例”
    wc.hInstance =hInst;//当前实例句柄
    wc.lpfnWndProc =_WndFun;//窗口处理函数为WndProc
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为默认图标
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);//窗口采用箭头光标
    wc.lpszMenuName =NULL;//窗口无菜单
    wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景为白色
    wc.style  =CS_HREDRAW|CS_VREDRAW;//窗口类型
    wc.cbClsExtra =0;//窗口类无扩展
    wc.cbWndExtra =0;//窗口实例无扩展
    RegisterClass(&wc);//注册
    }
    hWnd=CreateWindow( Name,//窗口类名
                       Name,//窗口标题名
                       WS_OVERLAPPEDWINDOW,//窗口的风格
                       300,
                       200,//窗口左上角坐标为默认值
                       400,
                       200,//窗口的高和宽为默认值
                       NULL,//此窗口无父窗口
                       NULL,//此窗口无主菜单
                       hInst,
                       NULL);ShowWindow(hWnd,nStyle);
    UpdateWindow(hWnd);
    while(GetMessage(&msg,NULL,0,0))    //消息循环
    {   
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }return msg.wParam;
    }
    long FAR PASCAL _WndFun(HWND hWnd,UINT mes,WPARAM wParam,LPARAM lParam)
    {
    static HWND hCir,hSqr,hBrsh;
    RECT w;
    HDC hdc;
    static int xc,yc;
    PAINTSTRUCT ps;
    UINT nc;
    switch(mes)
    {
       case WM_CREATE:
       GetClientRect(hWnd,&w);
       //建立椭圆的复选框
       hCir=CreateWindow("BUTTON","椭圆",BS_CHECKBOX|WS_CHILD|WS_VISIBLE,
                      w.left+50,w.bottom-80,80,25,hWnd,(HMENU)0,hCurInst,0);
       //建立矩形的复选框//---------------------
    //你这的赋值变量错了.. 
    //--------------------
       hSqr =CreateWindow("BUTTON","矩形",BS_CHECKBOX|WS_CHILD|WS_VISIBLE,
                      w.left+50,w.bottom-50,80,25,hWnd,(HMENU)1,hCurInst,0);
       return 0;   case WM_COMMAND:
       if((HWND)lParam==hCir)
       {
       //读取圆的复选框状态
       nc=(WORD)SendMessage(hCir,BM_GETCHECK,0,0L);
       if(nc==TRUE) SendMessage(hCir,BM_SETCHECK,0,0L);
       else SendMessage(hCir,BM_SETCHECK,1,0L);
       }
       else if((HWND)lParam==hSqr)
       {
       nc=(WORD)SendMessage(hSqr,BM_GETCHECK,0,0L);
       if(nc==TRUE) SendMessage(hSqr,BM_SETCHECK,0,0L);
       else SendMessage(hSqr,BM_SETCHECK,1,0L);
       }
       InvalidateRect(hWnd,0,TRUE);
       return 0;
       case WM_SIZE:
       xc=LOWORD(lParam)/2;
       yc=HIWORD(lParam)/2;   return 0;
       case WM_PAINT:
       hdc=BeginPaint(hWnd,&ps);
       nc=(WORD)SendMessage(hCir,BM_GETCHECK,0,0L);  //检查椭圆的复选框
       if(nc==TRUE) Ellipse(hdc,xc-40,yc-60,xc+80,yc+60);
       nc=(WORD)SendMessage(hSqr,BM_GETCHECK,0,0L);  //检查矩形的复选框
       hBrsh=(HWND)GetStockObject(NULL_BRUSH);     //选择空填充
       SelectObject(hdc,hBrsh);
       if(nc) Rectangle(hdc,xc-40,yc-60,xc+80,yc+60);
       EndPaint(hWnd,&ps);   return 0;
       case WM_DESTROY:
       PostQuitMessage(0); //释放所建窗口   return 0;
       default:       ////执行其他情况
       return DefWindowProc(hWnd,mes,wParam,lParam);
    }
    }
      

  2.   

    郁闷,本来分是我拿的,我看你问题的时候,还没登入!
    发现你的问题后(把WM_CREATE里的第二个hcir改成hSqr)!刚准备登入回答拿分,
    却发现问题刚好被解决了,郁闷啊郁闷,我的CSND的第一桶金啊