为什么WinMain函数里加载位图会出错?

fangongdalu7148 2010-04-11 07:01:30
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
CWnd * pwnd=CWnd::GetDesktopWindow();
CWindowDC dc(pwnd);
CRect wrect;
// pwnd->GetWindowRect(&wrect);
CBitmap bitmap;
CDC dcMemory;
// CDC * pdc;
bitmap.LoadBitmap(IDB_BITMAP2);//这里出错
CRect rect;
pwnd->GetWindowRect(&rect);
CBrush bru(&bitmap);
dc.FillRect(&rect,&bru);

return 0;
}
...全文
176 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgsdzhaolanxiang1 2010-04-17
  • 打赏
  • 举报
回复
呵呵 谢谢楼上解答 我还有很多东西要学呀
finder_zhang 2010-04-16
  • 打赏
  • 举报
回复
楼主,其实就是差了
AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdShow);
这个是吧.

根据 MFC深入浅出那个书的 思想,应该是只要我们把MFC要包的东西都包得够的话,任何时候都可以用MFC的,甚至像作者一样自己写也行.
zgsdzhaolanxiang1 2010-04-16
  • 打赏
  • 举报
回复
我用的是
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#if !defined(AFX_STDAFX_H__FE22E51B_ED47_491C_B52F_4ED2B73438F1__INCLUDED_)
#define AFX_STDAFX_H__FE22E51B_ED47_491C_B52F_4ED2B73438F1__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers

#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT


//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__FE22E51B_ED47_491C_B52F_4ED2B73438F1__INCLUDED_)
finder_zhang 2010-04-14
  • 打赏
  • 举报
回复
bitmap.LoadBitmap(IDB_BITMAP2);//这里出错
把上面这句,换成下面这句,程序就可以正常运行了。
bitmap.m_hObject = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP2));

出错的地方算是找到了。
在CBitmap.LoadBitmap()里面,会运行到一句,叫做。
ASSERT(afxCurrentResourceHandle != NULL)
解开这个宏,就是AfxGetModuleState()->m_hCurrentResourceHandle != NULL
而 AfxGetModuleState() 返回的是 AFX_MODULE_STATE*
这个 AFX_MODULE_STATE 里面有资料句柄,应用程序实例句柄等一堆东西,但现在这个
AFX_MODULE_STATE的类里的句柄,还未初始化,里面的句柄值还是0,可能是程序运行得太早了。
finder_zhang 2010-04-14
  • 打赏
  • 举报
回复
看了一下 深入浅出MFC, 问题终于解决了,漏了对 AFX_MODULE_STATE 数据的初始化.
只要在代码前加入 AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdShow);

AppInit.cpp 里有他的代码.

BOOL AFXAPI AfxWinInit(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);

// handle critical errors and avoid Windows message boxes
SetErrorMode(SetErrorMode(0) |
SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);

// set resource handles
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
pModuleState->m_hCurrentInstanceHandle = hInstance;
pModuleState->m_hCurrentResourceHandle = hInstance;

// fill in the initial state for the application
CWinApp* pApp = AfxGetApp();
if (pApp != NULL)
{
// Windows specific initialization (not done if no CWinApp)
pApp->m_hInstance = hInstance;
pApp->m_hPrevInstance = hPrevInstance;
pApp->m_lpCmdLine = lpCmdLine;
pApp->m_nCmdShow = nCmdShow;
pApp->SetCurrentHandles();
}

// initialize thread specific data (for main thread)
if (!afxContextIsDLL)
AfxInitThread();

return TRUE;
}


之后再运行楼主的代码,就不会报错了.
finder_zhang 2010-04-13
  • 打赏
  • 举报
回复
试了一下非MFC的代码。

HWND hDesk = GetDesktopWindow();
HDC hDc = GetWindowDC(hDesk);
HBITMAP hBmp = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP2));
RECT rt;
GetWindowRect(hDesk,&rt);
HBRUSH hBr = CreatePatternBrush(hBmp);
FillRect(hDc,&rt,hBr);
ReleaseDC(hDesk,hDc);


可以实现楼主的功能,把BITMAP2平铺到整个屏幕。
但MFC的CBitmap为何会失败,明天有空再慢慢研究研究。
arong1234 2010-04-13
  • 打赏
  • 举报
回复
能不能用MFC不仅仅是代码里需要考虑,还要考虑工程设置。你在创建工程时如果选择支持mfc,一般都可以使用mfc,否则就当作不行,不是说你包含了足够的头文件就可以的。这种Win32工程,除非你有耐心逐个比较那些支持MFC的工程的各个方面属性,你就当作他就不可以支持mfc好了(没有任何理由先建个win32工程,然后强迫他使用mfc的)
[Quote=引用 16 楼 finder_zhang 的回复:]
还是想搞清楚一些事情。
建一个WIN32的程序时,选MFC的选择关了,但是还是可以在建好后选的。
而建一个WIN32控制台时,是有MFC的选择的。到底什么情况下不能用MFC的类呢?
现在比较迷糊了。
我试了楼主的代码,就是自己建一个WIN32的,然后加上楼主的,再包含
#include <afx.h>
#include <afxwin.h> // MFC core and standa……
[/Quote]
finder_zhang 2010-04-13
  • 打赏
  • 举报
回复
还是想搞清楚一些事情。
建一个WIN32的程序时,选MFC的选择关了,但是还是可以在建好后选的。
而建一个WIN32控制台时,是有MFC的选择的。到底什么情况下不能用MFC的类呢?
现在比较迷糊了。
我试了楼主的代码,就是自己建一个WIN32的,然后加上楼主的,再包含
#include <afx.h>
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions

现在我也是和楼主同样的错误。
whatcanhumdo 2010-04-13
  • 打赏
  • 举报
回复
这有什么好争的 。楼主麻烦帖一下你使用的头文件 和你编译时候使用的参数,不要告诉我你知道编译的参数那里看啊!!
arong1234 2010-04-13
  • 打赏
  • 举报
回复
那不一样的,CString对MFC平台的依赖没有windows/thread之类对系统的依赖那么深。例如,对于CWnd对象,它依赖了TLS上定义的一系列东西,没有MFC支持,它根本不可能正常工作。
[Quote=引用 13 楼 finder_zhang 的回复:]
其实只要把 #include <windows.h> 改成 #include <afx.h>
再把project的属性那改为用 MFC 共享或静态库,就可以用MFC里的类的了。
就算是 console 的也可以的。我也常在 控制台里用 CString 那些的。
[/Quote]
finder_zhang 2010-04-13
  • 打赏
  • 举报
回复
其实只要把 #include <windows.h> 改成 #include <afx.h>
再把project的属性那改为用 MFC 共享或静态库,就可以用MFC里的类的了。
就算是 console 的也可以的。我也常在 控制台里用 CString 那些的。
awangjacky 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 arong1234 的回复:]
你有任何理由说它是MFC工程的?MFC工程从来就没见过WinMain


引用 6 楼 fangongdalu7148 的回复:
这就是MFC工程
[/Quote]

这就是用MFC的悲哀,给WinMain穿件马甲就不认识了~
Eleven 2010-04-13
  • 打赏
  • 举报
回复
你Debug调试一下,打开call stack窗口,看看哪句抛出异常。。。
arong1234 2010-04-13
  • 打赏
  • 举报
回复
你有任何理由说它是MFC工程的?MFC工程从来就没见过WinMain

[Quote=引用 6 楼 fangongdalu7148 的回复:]
这就是MFC工程
[/Quote]
stjay 2010-04-13
  • 打赏
  • 举报
回复
先执行AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0));
stjay 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fangongdalu7148 的回复:]
这就是MFC工程
[/Quote]

你硬说是MFC,没人帮到你
zgsdzhaolanxiang1 2010-04-13
  • 打赏
  • 举报
回复
晕 高手都哪去了??
zgsdzhaolanxiang1 2010-04-12
  • 打赏
  • 举报
回复
这就是MFC工程
arong1234 2010-04-11
  • 打赏
  • 举报
回复
带WinMain得这种工程应该不支持MFC吧,因此诸如CWnd,CBrush,CWindowDC之类得类都不应该被支持得。所以不要在这种WIn32工程中使用MFC了
zgsdzhaolanxiang1 2010-04-11
  • 打赏
  • 举报
回复
CWnd 指针 不是空的
唉 不知道 哪里错了 在单文档程序中 能运行 在Winmain中 运行不了了
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
CWnd * pwnd=CWnd::GetDesktopWindow();
CWindowDC dc(pwnd);
CRect wrect;

CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2);
CRect rect;
pwnd->GetWindowRect(&rect);
CBrush bru(&bitmap);
dc.FillRect(&rect,&bru);

return 0;
}
加载更多回复(3)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧