按课本编写了一个复选框程序,效果是点椭圆复选框画一个椭圆,点矩形复选框画一个矩形,程序虽然运行成功,但效果却出不来,具体程序如下,你可以直接把我的程序直接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);
}
}
/* 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);
}
}
...
------/* 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);
}
}
发现你的问题后(把WM_CREATE里的第二个hcir改成hSqr)!刚准备登入回答拿分,
却发现问题刚好被解决了,郁闷啊郁闷,我的CSND的第一桶金啊