MFC和SDK窗口的问题

coohai 2003-12-23 08:49:53
我想在MFC程序中,用SDK的方式创建一个窗口,但怎么也成功不了。请朋友们帮帮忙。
...全文
32 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
coohai 2003-12-30
  • 打赏
  • 举报
回复
To chehw(chehw):
  有几点疑问。
  1、 #define GWL_THIS 0
     #define GWL_DATA 4
这样定义宏会不会和原有的宏冲突,怎么解决?
  2、 友元函数可以访问类的成员函数,但必须得到类对象,或者类指针才行吧?
  3、 类的静态成员不能访问类的非静态成员。这样的话,如果将它要访问的成员也作为静态成员,这个类有点不伦不类这嫌。
chehw 2003-12-30
  • 打赏
  • 举报
回复
to ringphone(临风) :
使用GWL_USERDATA只是为了简化代码。
实际应用中通常需要设置窗口附加字节
WNDCLASSEX w={sizeof(WNDCLASSEX)};
w.cbWndExtra=16;//根据需要设定附加字节数。
...
RegisterClassEx(&w);

#define GWL_THIS 0
#define GWL_DATA 4
SetWindowLong(hWnd, GWL_THIS, this);

2、 To coohai(海) :
在WndProc中类调用成员函数有二种办法:
一是把WndProc作为类的友元函数。
class CMyWnd
{
friend LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
...
};
二是把WndProc作为类的静态成员变量。
class CMyWnd
{
...
protected:
static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};
coohai 2003-12-30
  • 打赏
  • 举报
回复
To ringphone(临风):
  明白你的意思了。那你说的这种方法得到指针,不正有你所说的弱点么?
  有解决的办法吗?
ringphone 2003-12-30
  • 打赏
  • 举报
回复
我知道可以这样做,但怎么样在WndProc中调用CMyWnd的成员函数呢?
  不要告诉我用全局变量,这我会。也不要告诉我传入到lParam参数中,因为要考虑消息是标准消息。
  总的来说,还是谢谢你!
-------------------------------------------------------------------
WndProc中 CMyWnd *pWnd=(CMyWnd *)GetWindowLong(hWnd,GWL_USERDATA);
这句就是取得CMyWnd对象指针,你就可以调用CMyWnd的成员函数了。

ringphone 2003-12-30
  • 打赏
  • 举报
回复
我是指chehw(chehw)的代码,他把窗口类对象指针放到窗口的绑定内存,然后在窗口消息循环中取出该值,如果在别的地方调用SetWindowLong(hWnd,GWL_USERDATA,0);冲掉了这个值,那就无法再得到窗口类对象指针。
MPU 2003-12-30
  • 打赏
  • 举报
回复
linjin101@163.com

我也想要
谢谢!!!
chehw 2003-12-30
  • 打赏
  • 举报
回复
邮件已发送。
coohai 2003-12-30
  • 打赏
  • 举报
回复
coohai@163.com
谢谢!
chehw 2003-12-30
  • 打赏
  • 举报
回复
1、设计程序时应有一套规范,来确保宏不会冲突。
2、3
留下你的EMAIL, 我给你发一个例子。
coohai 2003-12-29
  • 打赏
  • 举报
回复
To chehw(chehw):
我知道可以这样做,但怎么样在WndProc中调用CMyWnd的成员函数呢?
  不要告诉我用全局变量,这我会。也不要告诉我传入到lParam参数中,因为要考虑消息是标准消息。
  总的来说,还是谢谢你!
To tsjit(大灰狼皮皮):
  我想你没明白题意,你说的是文档视的MFC模式,我是说在MFC下用SDK动态创建窗口。
To ringphone(临风):
  不太明白你所说的弱点是什么?为什么会“惨了”,还请赐教。
chehw 2003-12-26
  • 打赏
  • 举报
回复
::GetLastError();看一下是什么错误。
Zark 2003-12-26
  • 打赏
  • 举报
回复
使用WIN32 API是可以在MFC程序中建立一个窗口的.不知楼主建不起来的原因是什么? 通常在在SDK中最常见的问题::CreateWindow()返回的HWND是个NULL.
Zark 2003-12-26
  • 打赏
  • 举报
回复
使用WIN32 API是可以在MFC程序中建立一个窗口的.不知楼主建不起来的原因是什么? 通常
alvachien 2003-12-26
  • 打赏
  • 举报
回复
也可以啊,在App的InitInstance创建一个自己想创建的窗口,Hide掉就可以了;
然后单击某个按钮的时候把你创建的窗口Show出来啊。
coohai 2003-12-26
  • 打赏
  • 举报
回复
斑竹,你不帮帮忙么?
ringphone 2003-12-26
  • 打赏
  • 举报
回复
楼上的楼上:
你的方法有个致命弱点,如果有人在别的地方调用SetWindowLong(hWnd,GWL_USERDATA,0L);你就惨了。
tsjit 2003-12-26
  • 打赏
  • 举报
回复
不用这么困难,我最近刚好做了一次.
具体如下.
1.使用多窗口编程.
2.在初始化函数中记录下你的模板指针.
BOOL CNewTestApp::InitInstance()
{
...
g_ListTemplate = new CMultiDocTemplate(
IDR_NEWTESTYPE,
RUNTIME_CLASS(CNewTestDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CNewTestView));
AddDocTemplate(g_ListTemplate);

g_EditTemplate = new CMultiDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CNewTestDoc),
RUNTIME_CLASS(CChildFrame), // main SDI frame window
RUNTIME_CLASS(CShowEditView));
AddDocTemplate(g_EditTemplate);
...
}
3.在需要生成新窗口时,调用如下:
curTemplate=pApp->g_ListTemplate;

CNewTestDoc* pPartDoc;
pApp->g_ModInf.iCurView=iIndex;
pPartDoc = (CNewTestDoc*)curTemplate->OpenDocumentFile(NULL);
4.这样就可以生成一个新的子窗口了,注意在MainFrm.cpp和ChildFrm.cpp中都要映射这个消息.
chehw 2003-12-26
  • 打赏
  • 举报
回复

1、在类中声明一个静态回调函数static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
2、在类中声明一个虚函数virtual LRESULT WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
3、创建窗口时最后一个参数要把类的指针传过去。
HWND CMyWnd::Create(...)
{
return CreateWindowEx(....., this);
}
4、在WndProc中根据类指针分发消息。
LRESULT CALLBACK CMyWnd::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CMyWnd *pWnd=(CMyWnd *)GetWindowLong(hWnd,GWL_USERDATA);
switch(uMsg)
{
case WM_CREATE:
LPCREATESTRUCT cs;
cs=(LPCREATESTRUCT)lParam;
pWnd=(CMyWnd *)cs->lpCreateParam;
if(pWnd)
{
pWnd->m_hWnd=hWnd;
SetWindowLong(hWnd,GWL_USERDATA,(LONG)pWnd);
}
break;
case WM_DESTROY:
if(pWnd)
{
SetWindowLong(hWnd,GWL_USERDATA,0L);
//delete pWnd;
pWnd=NULL;
}
return 0;
default:
break;
}
if(pWnd) return pWnd->WindowProc(uMsg,wParam,lParam);
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
coohai 2003-12-26
  • 打赏
  • 举报
回复
好了,窗口创建起来了。我新建了一个类,在这个类的内部完成注册窗口类,显示,还有销毁。但有个缺陷,在这个类中处理消息有点麻烦,不知怎么样重载处理好,所以重用性不好。
  具体为什么这样就行了,我也是一头雾水。
coohai 2003-12-26
  • 打赏
  • 举报
回复
这个我也看了,HWND是个NULL没错,GetLastError()得到的错误是“没有那个类名”;再用RegisterClass()注册窗口类后,得到的HWND也是个NULL,错误还是上面这个。
加载更多回复(7)

16,472

社区成员

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

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

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