各位,本人学习对话框也有一段时间了,总结了一下有3个小问题没弄明白,希望各位指点一下。1. 利用CFileDialog类进行操作,弹出的对话框一般有2个按钮,如果是利用
CFileDialog FileDlg( TRUE,  NULL,  NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter );
那么将出现 “打开”“取消”,这2个按钮的名称可以修改吗?比如改为“选择”,“放弃” ,应该怎样实现?
2.从某个对话框上设置按钮创建一个无模式对话框,用上
MyDlg->Create(IDD_DIALOG, NULL);//modeless dialogue   
MyDlg->ShowWindow(SW_SHOW);  

但是这个时候如果有多个对话框在界面上,那么点击其它的对话框,当创建的无模式对话框还在界面上的时候,会发现处于最上层的它遮挡了其它对话框。
是不是和 create函数参数设置有关,如何修改可以做到被点击对话框界面完全呈现而不被其他对话框遮挡?3. 把对话框的属性设置为Resizing ,可以实现拖拉放大。如何做到在拖拉放大的时候,对话框里边各个控件和用CPaintDC绘制的文字的相对布局不改变?
即原对话框中某个控件居中,拉伸后依然可以居中,一边拖拉对话框内各个控件的位置一边发生变化,但是界面不闪烁且整体布局不变。

解决方案 »

  1.   

    1.可以,你可以从CFiledialog继承下来
    2。setwindowpos
    3。响应wm_size大小,进行重绘
    4。楼主还是一题一问比较好
      

  2.   

    1、可以在对话框初始化时查找到控件,并SetWindowText;
    2、用SetWindowPos可以改变窗口的Z-order;
    3、响应WM_SIZE消息,根据窗口尺寸用MoveWindow逐一设置控件,但不能保证不闪烁(依赖于窗口和控件的刷新速度)。
      

  3.   

    闪烁的问题可以映射WM_ERASEBKGND消息,在里面不要用系统默认的,自己画个颜色上去就行了。更好的是用双光缓冲用位图贴上去。
      

  4.   

    1、自定义一个对话框类,继承自CFileDialog,这样在对话框的初始函数里可以添加代码,GetDlgItem(IDOK)->SetWindowText("选择");GetDlgItem(IDCANCLE)->SetWindowText("放弃"); 
    2、用SetWindowPos可以改变窗口的Z-order,使其成为TOPMOST即可; 
    3、添加WM_SIZE消息,通过GetClientRect得到窗口尺寸后再调用MoveWindow逐一调整各个子控件的位置。
      

  5.   

    sorry。答非所问了。如果你的对话框上绘制的文字比较多的话,拖动窗口的时候也会出现闪烁。我说的那个方法是处理这个闪烁的。所谓的双缓冲,原理是
    1. 创建一个与客户区同样大小的位图
    2. 将所有要描画的东西都画到这个位图上
    3. 将位图贴到窗口上
    注意,不要描画背景。也就是重载WM_ERASEBKGND消息,删掉里面的默认代码,然后返回TRUE。
    双缓冲的主要代码如下(放到对话框的OnPaint()函数里):
    CDC* pDC = GetDC();        //创建一个临时位图
    CBitmap bmp;
    pDC->SetTextAlign(TA_CENTER);
    CRect rect;
    CBrush b(RGB(255,255,255));
    GetClientRect(rect); bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
    CDC dc;
    dc.CreateCompatibleDC(pDC);
    CBitmap* pOldBmp = dc.SelectObject(&bmp);        //开始:描画所要话的东西,记住,要用dc,不是pDC
    dc.FillRect(rect, &b);   //画背景
    dc.SetBkMode(TRANSPARENT);
    dc.DrawText("test", rect, DT_CENTER|DT_SINGLELINE);
            //画到这里结束        //将图贴到客户区
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc, 0,0,SRCCOPY);
    dc.SelectObject(pOldBmp);至于子控件移动位置时产生的闪烁可以这样去掉:
    从资源浏览器里打开对话框的属性,将Clip Children属性选为TRUE就可以了。