您的位置:程序门 -> vc/mfc -> 界面



由cwnd派生的子类,怎么就不能够是模态的?(可能我提问的方式不怎么正确,但基本就是这样的)


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


由cwnd派生的子类,怎么就不能够是模态的?(可能我提问的方式不怎么正确,但基本就是这样的)[已结贴,结贴人:wirror800]
发表于:2007-05-05 16:41:15 楼主
各位高手:
  我最近在网上搜到一个跳棋的程序,我想在自己的对话框中,暂时命名为dialog1设置一个按钮,然后再调用这个程序,可是出现了一点小问题...
  在按钮的响应函数中,我是这样定义的:
  void   cokdlg::onbnenter()  
{
//   todo:   add   your   control   notification   handler   code   here
cttqdlg   dlg;
msg   msg;
cwnd*   m_pmainwnd;
m_pmainwnd   =   &dlg;
int   nresponse   =   dlg.createex(0,
afxregisterwndclass(0), "跳子棋 ",
ws_popup ¦ws_sysmenu,
crect(0,0,453,504),null,null,null);
hbmp   =   (hbitmap)loadimage(afxgetinstancehandle(),   makeintresource(idb_bitmbk),   image_bitmap,   0,   0,   lr_createdibsection);
hbmmp   =   (hbitmap)loadimage(afxgetinstancehandle(),   makeintresource(idb_bitmbk1),   image_bitmap,   0,   0,   lr_createdibsection);

bitmap   bm;
::getobject(hbmp,   sizeof(bm),   &bm);
hrgn   h   =   bitmaptoregion(hbmp);
if   (h)
::setwindowrgn(m_pmainwnd-> m_hwnd,   h,   true);
dlg.showwindow(sw_show);
dlg.updatewindow();
while(getmessage(&msg,(hwnd)null,0,0)){
translatemessage(&msg);
dispatchmessage(&msg);
}

}
其中cttqdlg是由cwnd派生的.
  在cttqdlg中有一个newgame()函数,用来显示一个模态的对话框,暂时取名为dialog2.
  运行的时候,当我显示dialog2的时候发现:dialog2可以跟cttqdlg的对象进行切换,对dialog1不能够切换.而在这个游戏的源程序中,dialog2对cttqdlg的对象是不可以切换的.
  我要实现的是,dialog2对以上这两个对象都不能够切换,该怎样实现的啊.如果需要的话,我可以把整个代码发给你帮我分析.拜托各位了!
发表于:2007-05-05 16:57:361楼 得分:4
应该用ui线程
发表于:2007-05-05 20:42:232楼 得分:0
大哥,可以解释一下为什么要用ui线程的吗?我是初学者,还请不吝赐教!
发表于:2007-05-07 01:17:283楼 得分:4
创建模态对话框的话,至少应该是用domodal(),而不是create.这是一个很明显的问题.
发表于:2007-05-07 23:19:574楼 得分:0
cwnd没有domodal()方法啊,晕!!!
发表于:2007-05-08 11:11:315楼 得分:8
runmodalloop
不过怎么不用cdialog
发表于:2007-05-09 13:32:366楼 得分:0
用cdialog也想的啊,可我不知道怎么显示不规则界面的dialog,就是根据一副位图来设计界面.还请大侠多多指教!
发表于:2007-05-09 21:35:397楼 得分:0
我今天弄了一天,终于把它改成了cdialog的,程序之前的毛病也不存在了,真是太感谢各位了!!!但是,在我关闭这个游戏界面的对话框时,出现了下面的错误提示:
    debug   assertion   fieled!
                program:.....
                file:thrdcore.cpp
                line:837

我大概在百度中搜了一下,感觉是消息循环出了问题,但又不知道错在哪儿了???
在我定义的这个cdialog里面,我定义了一个消息处理函数
lresult   cttqdlg::windowproc(uint   message,   wparam   wparam,   lparam   lparam)  
{
//   todo:   add   your   specialized   code   here   and/or   call   the   base   class

switch   (message)  
{ case   wm_nchittest:
// hdc   =   beginpaint   (hwnd,   &ps);

rect   yj1;

::getwindowrect(this-> m_hwnd,&yj1);
// crect   yj22;
points   yj2=(points)makepoints(lparam);
// endpaint   (hwnd,   &ps);
if(yj2.x> yj1.left+230&&yj2.x <yj1.left+419&&yj2.y> yj1.top&&yj2.y <yj1.top+20)

return   htcaption;
return   htclient;
case   wm_keydown:
if   (wparam   !=   vk_escape)
break;
case   wm_destroy:
if(this-> messagebox( "你真的要退出游戏吗? ", "跳子棋 ",mb_okcancel ¦mb_iconquestion   )==idok)
postquitmessage(0);
break;
default:
return   cwnd::windowproc(message,   wparam,   lparam);
}
return   cwnd::windowproc(message,   wparam,   lparam);
}
然后,问题似乎就出在
case   wm_destroy:
if(this-> messagebox( "你真的要退出游戏吗? ", "跳子棋 ",mb_okcancel ¦mb_iconquestion   )==idok)
postquitmessage(0);
break;
这一句中,在显示这个模态对话框时,我使用的语句是
dlg.domodal();
while(getmessage(&msg,(hwnd)null,0,0)){
translatemessage(&msg);
dispatchmessage(&msg);
}
不知道这里是不是也有问题,还请各位高手多多帮忙!!!!
发表于:2007-05-10 16:09:548楼 得分:0
忙活了一整天,终于把问题解决了,只是原理还不是很懂,希望各位高手多多指点!!
我总结了一下,我觉得jiangsheng(蒋晟.net[mvp])   对我的启发很大,我改用dlg来做这个程序后,效果真的很好!起初的关闭窗口有错误的问题,我这里总结了一下:
  通常关闭对话框窗口的方法有:
    postquitmessage(0);
     ::sendmessage(m_hwnd,wm_command,idcancel,0);
     postmessage(wm_close);
     postmessage(wm_quit);
     sendmessage(wm_destroy);//由ondestroy()来响应
     this-> destroywindow();
 cdialog::enddialog(0);//等等
而我的程序正是使用最后一种方法解决了问题~~~
发表于:2007-05-10 18:21:079楼 得分:4
解决了就值得恭喜下呢。
发表于:2007-05-17 19:48:1810楼 得分:0
哎,没人顶帖了,真郁闷,那就只好就此散分了哦!见者有份!
发表于:2007-05-17 19:49:5311楼 得分:0
。。。


快速检索

最新资讯
热门点击