首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

一些专牛角尖的有关问题,都在注释中。分就剩60了,麻烦高手们看看

2012-02-07 
一些专牛角尖的问题,都在注释中。分就剩60了,麻烦高手们看看。#include windows.h#include stdio.hLRESU

一些专牛角尖的问题,都在注释中。分就剩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> 再试一下。


热点排行