如果我有一个BITMAP名字bitmap,如何将其转换为HBITMAP?
到目前为止,我尝试过:
HBITMAP hbm = (HBITMAP)&bitmap; //doesn't work
HANDLE hand = &bitmap;
HBITMAP hbm = hand; //doesn't work
CImage cim;
cim.Attach(&bitmap);
HBITMAP hbm = cim.Detach(); //definitely doesn't work
CBitmap cbm;
cbm.Attach(bitmap);
CImage cim;
cim.Attach(cbm.Detach());
HBITMAP hbm = cbm.Detach(); //desperate I know, horribly failed
Run Code Online (Sandbox Code Playgroud)
必须有一些简单的,一行的方式来做它但我找不到它.我可以得到一些帮助吗?
我觉得我做的事情非常愚蠢,但我根本无法弄清楚我的代码有什么问题.我甚至制作了代码的超级简化版本,但仍然出现错误:
#include <iostream>
using namespace std;
class c1{
public:
c1(){}
~c1(){}
virtual int add(int a, int b);
private:
protected:
};
class c2 : c1{
public:
c2(){}
~c2(){}
int add(int a, int b){
return a+b;
}
};
int main(){
c2 c;
c.add(5,6);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以发现我确信有史以来最愚蠢的错误吗?
这是确切的错误消息:
1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall c1::add(int,int)" (?add@c1@@UAEHHH@Z)
Run Code Online (Sandbox Code Playgroud) 当我设置并创建这样的24位位图时:
//fileheader
BITMAPFILEHEADER* bf = new BITMAPFILEHEADER;
bf->bfType = 0x4d42;
bf->bfSize = 6054400 + 54;
bf->bfOffBits = 54;
//infoheader
BITMAPINFOHEADER* bi = new BITMAPINFOHEADER;
bi->biSize = 40;
bi->biWidth = 2752;
bi->biHeight = -733;
bi->biPlanes = 1;
bi->biBitCount = 24;
bi->biCompression = 0;
//bi->biSizeImage = 6054400;
bi->biXPelsPerMeter = 2835;
bi->biYPelsPerMeter = 2835;
bi->biClrUsed = 0;
bi->biClrImportant = 0;
pFrame->GetImage(m_imageData);
//
//create bitmap...
//(hbit is a global variable)
BITMAPINFO* bmi;
bmi = (BITMAPINFO*)bi;
HDC hdc = ::GetDC(NULL);
hbit = CreateDIBitmap(hdc, bi, CBM_INIT, …Run Code Online (Sandbox Code Playgroud) 在Visual Studio 2010中的一些C++文件中,行号旁边有这些奇怪的图标.我无法点击它们,右键单击它们,或以任何方式与它们进行交互.我唯一能做的就是移动/删除代码行,这些图标遵循它们所在的行/删除行时删除.
我到处都看,但一无所获.有人能告诉我这些是什么吗?

在我的一个对象中,我创建了一个无符号字符数组成员来存储一些图像数据:
unsigned char* imageData;
Run Code Online (Sandbox Code Playgroud)
在构造函数中,我用new初始化它:
MyObject::MyObject()
{
int imageSize = 6054400;
imageData = new unsigned char[imageSize];
}
Run Code Online (Sandbox Code Playgroud)
imageData在整个循环过程中被填充.
直到循环结束时才会删除此对象(MyObject),但我需要在循环中途删除imageData.所以我刚刚创建了这个函数:
void MyObject::DeleteAllMembers
{
delete [] imageData;
}
Run Code Online (Sandbox Code Playgroud)
我在循环结束时调用它:
theObj.DeleteAllMembers();
Run Code Online (Sandbox Code Playgroud)
问题是每次我的程序进入代码行:
delete [] imageData;
Run Code Online (Sandbox Code Playgroud)
它崩溃了,留下这个错误信息:

在这一点上,我不知道为什么会这样.
我尝试过的一些事情是:
imageData = 0删除它后尝试过,不幸的是我的程序仍在崩溃delete [] imageData.memset(&imageData, 0, imageSize);,但这给了我一个访问冲突错误.每次,程序仍然在同一行崩溃.我知道有人在看我的代码,认为"你好,你要做的就是____________________." 有人可以告诉我我做错了什么吗?
编辑:对不起我说错了.我每次在开始时创建该对象循环和它能够在结束时删除循环,我不知道为什么我在节目的开头和结尾说.
我正在使用MFC对话框,我不知道如何从非成员函数访问对象的成员变量(编辑控件,按钮,复选框等).
由于对象是在创建任何的.cpp,所有的对象事件在whateverDlg.cpp处理,而后者#include的前者,我无法用常规手段获得DLG的成员.
澄清示例:
void BlahDlg::OnBnClickedblah()
{
//...
CString text = L"blahblahblah";
m_bEditControl.SetWindowTextW(text.GetBuffer()); //works fine
//...
}
void nonMember()
{
//...
CString text = L"blahblahblah";
m_bEditControl.SetWindowTextW(text.GetBuffer()); //m_bEditControl is unknown
//...
}
Run Code Online (Sandbox Code Playgroud)
换句话说:我应该怎么做才能m_bEditControl从非成员函数访问(或任何其他对话框的成员)?