一些专牛角尖的问题,都在注释中。分就剩60了,麻烦高手们看看。
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSkyProc( HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
HDC hdc;
switch(uMsg)
{
case WM_PAINT:
PAINTSTRUCT ps;
hdc=BeginPaint(hwnd,&ps);
TextOut(hdc,30,30,L "重绘画 ",sizeof(L "重绘画 "));
EndPaint(hwnd,&ps);
break;
case WM_CHAR:
hdc=GetDC(hwnd);
TCHAR TempOut[10];
swprintf(TempOut,TEXT( "Char is %c "),wParam);
TextOut(hdc,30,30,TempOut,sizeof(TempOut));
ReleaseDC(hwnd,hdc);
break;
case WM_DESTROY:
DestroyWindow(hwnd);
break;
case WM_QUIT:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,TEXT( "LButtonDown "),TEXT( "Myapplication "),MB_OK);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
}
int WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra =0;
//wndcls.hbrBackground=(HBRUSH)GetStockObject(DC_BRUSH); //MSDN 上说可以用 DC_BRUSH ,为什么不行?
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor =LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndcls.hInstance =hInstance;
wndcls.lpfnWndProc =WinSkyProc;
wndcls.lpszClassName=TEXT( "Sky ");
wndcls.lpszMenuName =NULL;
wndcls.style =CS_HREDRAW | CS_VREDRAW;
//HWND hwnd;
//hwnd=CreateWindow(RegisterClass(&wndcls),TEXT( "Sky First Window "),WS_OVERLAPPEDWINDOW,30,30,100,200,NULL,NULL,hInstance,NULL);
//为什么下面三行不能用上面注释的两行代替?MSDN 上说: Pointer to a null-terminated string or a class atom
RegisterClass(&wndcls);
HWND hwnd;
hwnd=CreateWindow(TEXT( "Sky "),TEXT( "Sky First Window "),WS_OVERLAPPEDWINDOW,30,30,100,200,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_NORMAL);
UpdateWindow(hwnd);
MSG msg;
TCHAR temp[100]={0};
while(GetMessage(&msg,NULL,0,0))
{
//_itow(msg.message,temp,10);
//MessageBox(hwnd,temp ,TEXT( "Myapplication "),MB_OK);
TranslateMessage(&msg);
//_itow(msg.message,temp,10);
//MessageBox(hwnd,temp ,TEXT( "Myapplication "),MB_OK);
DispatchMessage(&msg);
//上面的四行注释,是想试下 TranslateMessage 是否能转换消息,结果 MessageBox 成对弹出四次,为什么?
}
_itow(msg.wParam ,temp,10);
MessageBox(hwnd,temp ,TEXT( "Myapplication "),MB_OK);
//上面两句我想试下 函数返回值是不是由 PostQuitMessage(0) 的参数决定?
return msg.wParam ;
}
//会有一些否决警告,如下。 要用什么函数来代替?
/*
“swprintf”被声明为否决的
“WinMain”: 必须是“__stdcall”
从“WPARAM”转换到“int”,可能丢失数据
“_itow”被声明为否决的
“WinSkyProc”: 不是所有的控件路径都返回值
*/
[解决办法]
1、TextOut(hdc,30,30,L "重绘画 ",sizeof(L "重绘画 "));//有问题,应用TextOut(...,TEXT( "重绘画 "),lstrlen(TEXT( "重绘画 "))); 最后一个参数返回的是字符串的长度,不是字节数。
2、DC_BRUSH要求在win2000以上系统才可使用,因此需指明当前操作系统版本。
#define _WIN32_WINNT 0x500
#include <windows.h>
3、//hwnd=CreateWindow(RegisterClass(&wndcls),TEXT( "Sky First Window "),WS_OVERLAPPEDWINDOW,30,30,100,200,NULL,NULL,hInstance,NULL);
第一个参数要求的类型是LPCTSTR,当传递atom时,必须强制类型转换。
例:rc=RegisterClass(&wndcls);
hwnd=CreateWindow((LPCTSTR)rc, ...);
4、//上面的四行注释,是想试下 TranslateMessage 是否能转换消息,结果 MessageBox 成对弹出四次,为什么?
框架窗口创建时,至少要发送WM_NCCREATE、WM_CREATE、WM_SIZE、WM_PAINT四次消息,每次发送消息必经GetMessage循环。
5、LRESULT CALLBACK WinSkyProc( ...)
{
switch(...)
{
...
}
return 0L;
}
6、_itow(msg.wParam ,temp,10); 改成_ltow((LONG)msg.wParam, temp, 10);
swprintf // 你的工程是否为UNICODE版本?加上include <wchar.h> 再试一下。