热情软件屋

 

为什么RegisterClass不能成功


编号:QA004020
建立日期: 2001年3月22日 最后修改日期:2001年3月22日
所属类别:

张某:
    操作系统: win98
    编程工具: vc++6.0
    问题: 为更好得学习MFC,我正在学习WIN32 API我建立了一个WIN32小程序(New-->Win32 Application-->an empty project)接着new-->C++ source file并敲进如下程序,编译后没有错误,可执行时什么也没出现。
    请各路高手帮帮忙,给我的程序诊断一下。
    我用的是VC++6.0
    全部程序如下:
    #include<windows.h>
    #include<string.h>
    #include<stdio.h>
    LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
    char szWinName[]="MyWin";
    char str[255]="";
    int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPreInst,LPSTR lpszArgs,INT nWinMode)
    {HWND hwnd;
    MSG msg;
    WNDCLASSEX wcl;
    wcl.cbSize=sizeof(WNDCLASSEX);
    wcl.style=0;
    wcl.lpfnWndProc=WindowFunc;
    wcl.cbClsExtra=0;
    wcl.cbWndExtra=0;
    wcl.hInstance=hThisInst;
    wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);
     wcl.hIconSm=LoadIcon(NULL,IDI_WINLOGO);
    wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
    wcl.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//此处用到了类型强制转换
    wcl.lpszMenuName=NULL;
    wcl.lpszClassName=szWinName;
    if(!RegisterClass((const struct tagWNDCLASSA *)&wcl)) return 0;
    hwnd=CreateWindow(
    szWinName,//窗口类名
    "Processing WM_CHAR Message",//窗口标题
    WS_OVERLAPPEDWINDOW,//窗口风格
    CW_USEDEFAULT,//初始x坐标
    CW_USEDEFAULT,//初始y坐标
    CW_USEDEFAULT,//初始宽度
    CW_USEDEFAULT,//初始高度
    HWND_DESKTOP,//父窗口句柄
    NULL,//窗口菜单句柄
    hThisInst,//程序当前句柄
    NULL);//创建参数
     ShowWindow(hwnd,nWinMode);//显示窗口
     UpdateWindow(hwnd);//刷新窗口用户区
    while(GetMessage(&msg,NULL,0,0))//创建消息循环
    {
    TranslateMessage(&msg);//翻译键盘消息
     DispatchMessage(&msg);
    }
    return msg.wParam;
    }
    LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    HDC hdc;
    switch(message)
    {
    case WM_CHAR:
    hdc=GetDC(hwnd);
    TextOut(hdc,1,1,"",3);
    sprintf(str,"%c",(char)wParam);
    TextOut(hdc,1,1,str,strlen(str));
    ReleaseDC(hwnd,hdc);
    break;
    case WM_DESTROY://关闭窗口
    PostQuitMessage(0);
    break;
     default:
     return DefWindowProc(hwnd,message,wParam,lParam);
    }
    return 0;
    }
    水平: 刚入门

回答:

    既然你使用WNDCLASSEX结构来定义窗口类,当然不能使用RegisterClass,而应该使用RegisterClassEx。
    if(!RegisterClassEx((WNDCLASSEX *)&wcl))
     return 0;
    其实如果你使用单步跟踪的话,很容易找到这个错误。

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio