CreateWindow()

由于这是我的第一篇博文,粗略的介绍下我在使用CreateWindow()函数时遇到的问题,用CreateWindow创建窗口,成功是返回窗口句柄,但是我在此函数的第一个参数LPCTSTR lpClassName 中使用字符串“Button ”(注意末尾有空格),总是创建失败,而除掉空格后者返回成功,不知是怎么回事,此问题纠结了我很长时间,今挂出问题一来警示后人,二来求高手解答。谢

附源代码:

<span style="background-color: rgb(255, 255, 255);">#include <Windows.h>
#define ID_SMALLER 1
#define ID_LARGER 2
#define BTN_WIDTH (8*cxChar)
#define BTN_HEIGHT (4*cyChar)
LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);
HINSTANCE hInst;


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
static TCHAR szAppName[]="OwnDraw";
MSG msg;
HWND hwnd;
WNDCLASS wndclass;


wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=szAppName;
wndclass.style=CS_HREDRAW |CS_VREDRAW;


if (!RegisterClass(&wndclass))
{
MessageBox(NULL,"ERROR","System tip",MB_CANCELTRYCONTINUE);
return 0;
}


hwnd=CreateWindow(szAppName,"OWN_Draw",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);


ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);


while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void Triangle(HDC hdc,POINT point[])
{
SelectObject(hdc,GetStockObject(BLACK_BRUSH));
Polygon(hdc,point,3);
SelectObject(hdc,GetStockObject(WHITE_BRUSH));
}


LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HWND hwndSmaller,hwndLarger;
static int cxClient,cyClient,cxChar,cyChar;
int cx,cy;
LPDRAWITEMSTRUCT pdis;
POINT pt[3];
RECT rc;


switch(message)
{
case WM_CREATE:
cxChar=LOWORD(GetDialogBaseUnits());
cyChar=HIWORD(GetDialogBaseUnits());

hwndSmaller=CreateWindow("Button ",TEXT(" "),WS_CHILD |WS_VISIBLE |BS_OWNERDRAW,
0,0,BTN_WIDTH,BTN_HEIGHT,hwnd,(HMENU)ID_SMALLER,hInst,NULL);
hwndLarger=CreateWindow("Button"," ",WS_CHILD |WS_VISIBLE |BS_OWNERDRAW,
0,0,BTN_WIDTH,BTN_HEIGHT,hwnd,(HMENU)ID_LARGER,hInst,NULL);

if (hwndSmaller==NULL || hwndLarger==NULL)
{
MessageBox(NULL,"ERROR","Tip",MB_OK);
} 
return 0;


case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);



MoveWindow(hwndSmaller,cxClient/2-3*BTN_WIDTH/2,
cyClient/2-BTN_HEIGHT/2,BTN_WIDTH,BTN_HEIGHT,TRUE);
MoveWindow(hwndLarger,cxClient/2+BTN_WIDTH/2,
cyClient/2-BTN_HEIGHT/2,BTN_WIDTH,BTN_HEIGHT,TRUE);
return 0;


case WM_COMMAND:
GetWindowRect(hwnd,&rc);


switch(wParam)
{
case ID_SMALLER:
rc.left+=cxClient/20;
rc.right-=cxClient/20;
rc.top+=cyClient/20;
rc.bottom-=cyClient/20;
break;
case ID_LARGER:
rc.left-=cxClient/20;
rc.right+=cxClient/20;
rc.top-=cyClient/20;
rc.bottom+=cyClient/20;
break;
}
MoveWindow(hwnd,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,TRUE);

return 0;


case WM_DRAWITEM:
pdis=(LPDRAWITEMSTRUCT)lParam;


FillRect(pdis->hDC,&pdis->rcItem,(HBRUSH)GetStockObject(WHITE_BRUSH));
// FillRect(pdis->hDC,&pdis->rcItem,(HBRUSH)GetStockObject(BLACK_BRUSH));


FrameRect (pdis->hDC, &pdis->rcItem,
(HBRUSH) GetStockObject (BLACK_BRUSH)) ;


// Draw inward and outward black triangles
cx = pdis->rcItem.right  - pdis->rcItem.left ;
cy = pdis->rcItem.bottom - pdis->rcItem.top  ;


switch (pdis->CtlID)
{
case ID_SMALLER :
pt[0].x = 3 * cx / 8 ;  pt[0].y = 1 * cy / 8 ;
pt[1].x = 5 * cx / 8 ;  pt[1].y = 1 * cy / 8 ;
pt[2].x = 4 * cx / 8 ;  pt[2].y = 3 * cy / 8 ;


Triangle (pdis->hDC, pt) ;


pt[0].x = 7 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
pt[1].x = 7 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
pt[2].x = 5 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;


Triangle (pdis->hDC, pt) ;


pt[0].x = 5 * cx / 8 ;  pt[0].y = 7 * cy / 8 ;
pt[1].x = 3 * cx / 8 ;  pt[1].y = 7 * cy / 8 ;
pt[2].x = 4 * cx / 8 ;  pt[2].y = 5 * cy / 8 ;


Triangle (pdis->hDC, pt) ;


pt[0].x = 1 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
pt[1].x = 1 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
pt[2].x = 3 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;


Triangle (pdis->hDC, pt) ;
break ;


case ID_LARGER :
pt[0].x = 5 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
pt[1].x = 3 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
pt[2].x = 4 * cx / 8 ;  pt[2].y = 1 * cy / 8 ;


Triangle (pdis->hDC, pt) ;


pt[0].x = 5 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
pt[1].x = 5 * cx / 8 ;  pt[1].y = 3 * cy / 8 ;
pt[2].x = 7 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;


Triangle (pdis->hDC, pt) ;
pt[0].x = 3 * cx / 8 ;  pt[0].y = 5 * cy / 8 ;
pt[1].x = 5 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
pt[2].x = 4 * cx / 8 ;  pt[2].y = 7 * cy / 8 ;


Triangle (pdis->hDC, pt) ;
pt[0].x = 3 * cx / 8 ;  pt[0].y = 3 * cy / 8 ;
pt[1].x = 3 * cx / 8 ;  pt[1].y = 5 * cy / 8 ;
pt[2].x = 1 * cx / 8 ;  pt[2].y = 4 * cy / 8 ;


Triangle (pdis->hDC, pt) ;
break ;
}


// Invert the rectangle if the button is selected


if (pdis->itemState & ODS_SELECTED)
InvertRect (pdis->hDC, &pdis->rcItem) ;


// Draw a focus rectangle if the button has the focus


if (pdis->itemState & ODS_FOCUS)
{
pdis->rcItem.left   += cx / 16 ;
pdis->rcItem.top    += cy / 16 ;
pdis->rcItem.right  -= cx / 16 ;
pdis->rcItem.bottom -= cy / 16 ;


DrawFocusRect (pdis->hDC, &pdis->rcItem) ;
}
return 0 ;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
</span>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值