热情软件屋

 

按下对话框标题栏上的关闭按钮,可对话框并没有关闭


编号:QA004582
建立日期: 2002年3月17日 最后修改日期:2002年3月17日
所属类别:

心如死水:
    操作系统: Windows 2000 & Me & XP
    编程工具: VB6.0
    问题: '如果vb做不到请给我回复,别让我等到花儿也谢了。我给您发了几次信了。
    1、创建后的对话框,按下标题栏上的关闭按钮,可对话框并没有关闭。
    2、创建的对话框,并不像 MessageBox 一样使(hWndParen:识别对话框的窗体)处于静止状态。
    3、在对话框上创建的按钮不响应键盘 TAB 键的焦点转移。
    '谢谢先了 谢谢先了
    Public Sub CreatefrmDlg()
     Dim hDig As Long
     Dim Dialog As DLGTEMPLATE
     Dialog.cx = 100
     Dialog.cy = 100
     Dialog.Style = WS_VISIBLE Or DS_MODALFRAME Or WS_SYSMENU
     Dialog.x = 0
     Dialog.y = 0
     hDig = DialogBoxIndirectParam(App.hInstance, Dialog, frmMain.hwnd, AddressOf DlgProc, 0)
     If hDig <> 0 Then: ShowWindow hDig, 1
    End Sub
    
    Private Function DlgProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
     Dim hBut1 As Long, hBut2 As Long
     Select Case uMsg
     Case WM_INITDIALOG
     hBut1 = CreateWindowEx(0&, "BUTTON", "确定", WS_VISIBLE Or WS_CHILD Or BS_TEXT, 30, 10, 62, 24, hWnd, 0&,App.hInstance, 0&)
     hBut2 = CreateWindowEx(0&, "BUTTON", "取消", WS_VISIBLE Or WS_CHILD Or BS_TEXT, 94, 10, 62, 24, hWnd, 1&, App.hInstance, 0&)
     End Select
    End Function
    

    水平: 中级

回答:

    主要的问题是你在DlgProc中没有响应WM_COMMAND。另外,一般OK按钮的ID为1,Cancel的ID为2。修改后的程序如下:
    Public Sub CreatefrmDlg()
     Dim hDig As Long
     Dim Dialog As DLGTEMPLATE
     Dialog.cx = 100
     Dialog.cy = 100
     Dialog.style = WS_VISIBLE Or DS_MODALFRAME Or WS_SYSMENU
     Dialog.x = 0
     Dialog.y = 0
     hDig = DialogBoxIndirectParam(App.hInstance, Dialog, frmMain.hwnd, AddressOf DlgProc, 0)
    End Sub
    
    Private Function DlgProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
     Dim hBut1 As Long, hBut2 As Long
     Select Case uMsg
     Case WM_INITDIALOG
     hBut1 = CreateWindowEx(0&, "BUTTON", "确定", WS_VISIBLE Or WS_CHILD Or BS_TEXT, 30, 10, 62, 24, hwnd, 1&, App.hInstance, 0&)
     hBut2 = CreateWindowEx(0&, "BUTTON", "取消", WS_VISIBLE Or WS_CHILD Or BS_TEXT, 94, 10, 62, 24, hwnd, 2&, App.hInstance, 0&)
     Case WM_COMMAND:
     Debug.Print wParam
     If wParam = IDCANCEL Then
     EndDialog hwnd, 1
     DlgProc = 1
     End If
     End Select
     DlgProc = 0
    End Function
    

    之所以迟迟没有回答你的问题是因为我们不赞成采用这样的方式编写程序,这样并不能减少使用的资源,而且VB的长处也没有得到发挥。要想这样编程,还不如用C呢。我们有一个原则,就是优先回答那些多数用户都关心的问题。欢迎你继续提问,但我们不会再回答类似的问题。

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio