Windows应用程序框架的创建(做网上的例子,出现的问题)

 被一个简单的windows程序卡死了,帮帮忙!!!
//
//  C04SWA.CPP
//  Simple Windows Application Template
//  Copyright (c) Chris H. Pappas and William H. Murray, 1992
//

#include <windows.h>

LONG FAR PASCAL WndProc(HWND,UINT,WPARAM,LPARAM);

char szProgName[]="ProgName";

// Remove next line for Microsoft C++ compile
//#pragma argsused

int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPreInst,
                   LPSTR lpszCmdLine,int nCmdShow)
{
  HWND hWnd;
  MSG  lpMsg;
  WNDCLASS wcApp;
  if (!hPreInst) {
    wcApp.lpszClassName=szProgName;
    wcApp.hInstance    =hInst;
    wcApp.lpfnWndProc  =WndProc;
    wcApp.hCursor      =LoadCursor(NULL,IDC_ARROW);
    wcApp.hIcon        =NULL;
    wcApp.lpszMenuName =NULL;
    wcApp.hbrBackground=GetStockObject(WHITE_BRUSH);
    wcApp.style        =CS_HREDRAW|CS_VREDRAW;
    wcApp.cbClsExtra   =0;
    wcApp.cbWndExtra   =0;
    if (!RegisterClass (&wcApp))
      return FALSE;
  }
  hWnd=CreateWindow(szProgName,"Simple Windows Application",
                    WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
                    CW_USEDEFAULT,CW_USEDEFAULT,
                    CW_USEDEFAULT,(HWND)NULL,(HMENU)NULL,
                    (HANDLE)hInst,(LPSTR)NULL);
  ShowWindow(hWnd,nCmdShow);
  UpdateWindow(hWnd);
  while (GetMessage(&lpMsg,NULL,NULL,NULL)) {
    TranslateMessage(&lpMsg);
    DispatchMessage(&lpMsg);
  }
  return(lpMsg.wParam);
}

LONG FAR PASCAL WndProc(HWND hWnd,UINT messg,
                        WPARAM wParam,LPARAM lParam)
{
  PAINTSTRUCT ps;
  HDC hdc;

  switch (messg)
  {
    case WM_PAINT:
      hdc=BeginPaint(hWnd,&ps);
//--------- your routines below ---------


//--------- your routines above ---------
      ValidateRect(hWnd,NULL);
      EndPaint(hWnd,&ps);
      break;
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    default:
      return(DefWindowProc(hWnd,messg,wParam,lParam));
  }
  return(0L);
}
代码如上。载vc++6.0环境下编译总是出现如下错误:
H:/VC++/Windows 3.1/C04SWA.CPP(29) : error C2440: '=' : cannot convert from 'void *' to 'struct HBRUSH__ *'
        Conversion from 'void*' to pointer to non-'void' requires an explicit cast
H:/VC++/Windows 3.1/C04SWA.CPP(40) : error C2664: 'CreateWindowExA' : cannot convert parameter 11 from 'void *' to 'struct HINSTANCE__ *'
        Conversion from 'void*' to pointer to non-'void' requires an explicit cast
第一个错误似乎可以经过强制转化解决(也不知对不对,汗!),第二个错误怎么也搞不定,我都要崩溃了。本来是为了学好VC才特意去看windows编程的,结果一开始就撞墙。各位大侠请伸出援手,帮忙解决一下,请同志们多多回帖,出个主意。谢谢!
  
 回复人:dawulibo 回复时间:2005-12-15 9:04:00
一觉醒来,忽然想到VC也可以由wizards代劳写出win32代码,于是赶紧上实验室wizards一个,与自己那个比较一下,发现了不同之处。向导生成的代码中的CreateWindow里,参数没有一个有前缀括号说明数据类型,我于是干脆把自己的(其实是书上的)代码也去掉说明,居然编译通过了,然后连接虽然有错,但那是小问题了,很容易就解决了。真是畅快啊!
不过遗憾的是我不知道原因,如果有高手知道一二,还望指点迷津。在此拜谢了
 
 回复人:amons 回复时间:2005-12-15 9:40:00

这个要强制转换
  wcApp.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
这个里面的参数不要强制转换
hWnd=CreateWindow(szProgName,"Simple Windows Application",
                    WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
                    CW_USEDEFAULT,CW_USEDEFAULT,
                    CW_USEDEFAULT,NULL,NULL,
                    hInst,NULL);


 
 回复人:dawulibo 回复时间:2005-12-15 9:45:00
对,就是这样的。可是我怎么也想不明白。原因在哪里。
 
 回复人:boxertony 回复时间:2005-12-15 10:27:00
CreateWindows的倒数第二个参数的类型是HINSTANCE,而不是HANDLE,你不能乱强制转换呀。
 
 回复人:amons 回复时间:2005-12-15 17:43:00
我只知道在WinAPI中有一大堆以大写H开头的东东,通常叫句柄,其实都是指针,在VC中特别是WinAPI 中会经常遇到,这些句柄的区别就不知道了。为了把这两个句柄整明白,就在VC的头文件中搜索这些句柄的原始定义,用关键字搜索文件。
整个程序只有一个头文件windows.h,这个头文件里又包含了一堆头文件,定义肯定在这些头文件里面,搜索之后在头文件windef.h中发现了一句
DECLARE_HANDLE(HINSTANCE);
DECLARE_HANDLE一看就知道是个宏定义,什么意思呢?继续在windef.h中找
这里面没有DECLARE_HANDLE的定义,但却只包含了一个头文件#include <winnt.h>
终于在winnt.h中找到HANDLE和DECLARE_HANDLE的定义
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
费了老大劲终于整明白了:HANDLE就是void*,而WINDEF.H中的这一句
DECLARE_HANDLE(HINSTANCE);
HINSTANCE成了struct HINSTANCE##*型(在错误提示中怎么又成了struct HINSTANCE__* 就不明白了),也就是说HINSTANCE和HANDLE都是指针, HANDLE是void指针, HINSTANCE是结构体指针。结构体指针赋给void指针当然没问题,void指针赋给结构体指针就要强制转换了。
举个例子:
HANDLE hdl;
HINSTANCE hin;
hdl=hin;//正确
hin=hdl;//错误
hin=(HINSTANCE)hal;//强制转换,正确。
其它的句柄和HINSTANCE差不多的,只有HANDLE比较特殊。
还有CreateWindow函数的自动提示参数类型是不对的,那个参数要求应该是HINSTANCE。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值