• VC6 WIN32,Dialog为主窗口编程


    VC6是Microsoft非常经典的开发环境,尤其是Windows API方式开发,自从Quick C for win以来基本保持着同样的风格和API,在它上面做习练很不错。下面是习练完成的界面,它是在自动创建的WIN32 application模板下,增加一个Dialog,然后将Dialog嵌入到默认页面中的,这样Dialog即为应用窗体,而Dialog则可以借助于Dialog Editor摆放控件,接近于RAD方式开发。

    步骤一:创造WIN32应用程序。

    创建后大致浏览一下WIN32开发套路,建应用程序结构、注册窗口、显示并update窗口,然后进入消息主循环。这种结构是基础,在Dev C、PowerBASIC, FreeBASIC的Win32开发也是一样的,与开发语言没关系,是WIN32SDK 开发结构上的要求。

    步骤二:SDI界面创建后,马上创建自己的Dialog

    1. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    2. {
    3. HWND hWnd;
    4. hInst = hInstance; // Store instance handle in our global variable
    5. hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    6. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    7. if (!hWnd)
    8. {
    9. return FALSE;
    10. }
    11. hWndGlobal = hWnd;
    12. SetWindowText(hWnd, "Dialog as Application - VC6");
    13. nCmdShow = SW_SHOW;
    14. ShowWindow(hWnd, nCmdShow);
    15. UpdateWindow(hWnd);
    16. // Create DIALOG box
    17. HWND hDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_MAINFORM), hWnd, (DLGPROC)Mainform);
    18. // Show DIALOG box
    19. ShowWindow(hDlg, SW_SHOWNA);
    20. UpdateWindow(hWnd);
    21. RECT rectDlgw, rectDlgc, rectMainw, rectMainc;
    22. GetWindowRect(hWnd, &rectMainw); //Dialog window area
    23. GetClientRect(hWnd, &rectMainc); //Dialog client area
    24. GetWindowRect(hDlg, &rectDlgw); //Dialog window area
    25. GetClientRect(hDlg, &rectDlgc); //Dialog client area
    26. RECT rect;
    27. HWND hwndDT=GetDesktopWindow();
    28. GetClientRect(hwndDT,&rect);
    29. LONG dtWidth=rect.right-rect.left;
    30. LONG dtHeight=rect.bottom-rect.top;
    31. RECT rectbar;
    32. HWND taskbar = FindWindow("Shell_TrayWnd", "");
    33. GetWindowRect(taskbar, &rectbar);
    34. //if(rectbar.top>0) //TASKBAR at bottom
    35. //if(rectbar.left>0) //TASKBAR at left
    36. //Center MAINWINDOW at desktop client area
    37. MoveWindow(hWnd, (rectbar.right-rectbar.left)+(dtWidth-(rectMainw.right-rectMainw.left))/2, (dtHeight-(rectMainw.bottom-rectMainw.top))/2, (rectDlgw.right-rectDlgw.left), (rectDlgw.bottom-rectDlgw.top) + (rectDlgc.bottom-rectDlgc.top)-(rectMainc.bottom-rectMainc.top)+1, 1);
    38. //Align inner DIALOG to MAINWINDOW
    39. MoveWindow(hDlg, 0, 0, rectDlgw.right, rectDlgw.bottom, 1);
    40. UpdateWindow(hWnd);
    41. return TRUE;
    42. }

    上面这两句是重点,这两句下面的功能是计算后调整SDI窗体,让它刚好将Dialog装入进去,并将它们显示在屏幕中央位置。

    (DLGPROC)Mainform 参数指的是回调函数,在CALLBACK函数Mainform中,对Dialog Editor摆放的控件进行操作。

    步骤三:操作Dialog 控件

    1. LRESULT CALLBACK Mainform(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    2. {
    3. switch (message)
    4. {
    5. case WM_INITDIALOG:
    6. {
    7. //Change DIALOG icon
    8. HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON3));
    9. SetClassLong(hDlg, GCL_HICONSM, (LONG)hIcon);
    10. GetDlgItem(hDlg, IDC_PROGRESS1);
    11. SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETRANGE, MAKEWPARAM(0, 0), MAKELPARAM(0, 59));
    12. //SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, (WPARAM)(0, 65), (LPARAM)(0, 0));
    13. SetTimer(hDlg, 1, 1000, NULL);
    14. //KillTimer(hDlg, 1);
    15. break;
    16. /*
    17. typedef struct _SYSTEMTIME {
    18. WORD wYear;
    19. WORD wMonth;
    20. WORD wDayOfWeek;
    21. WORD wDay;
    22. WORD wHour;
    23. WORD wMinute;
    24. WORD wSecond;
    25. WORD wMilliseconds;
    26. } SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
    27. */
    28. SYSTEMTIME st, lt;
    29. GetSystemTime(&st);
    30. GetLocalTime(&lt);
    31. SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, (WPARAM)(0, st.wSecond), (LPARAM)(0, 0));
    32. break;
    33. case WM_TIMER:
    34. {
    35. SYSTEMTIME st, lt;
    36. GetSystemTime(&st);
    37. GetLocalTime(&lt);
    38. SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, (WPARAM)(0, st.wSecond), (LPARAM)(0, 0));
    39. }
    40. break;
    41. case WM_PAINT:
    42. break;
    43. case WM_CTLCOLORDLG:
    44. break;
    45. case WM_ERASEBKGND:
    46. case WM_NCPAINT:
    47. break;
    48. case WM_SYSCOMMAND:
    49. if (wParam == SC_CLOSE)
    50. {
    51. EndDialog (hDlg, TRUE);
    52. KillTimer(hDlg, 1);
    53. PostQuitMessage(0);
    54. return(TRUE);
    55. }
    56. break;
    57. case WM_COMMAND:
    58. //if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    59. if (LOWORD(wParam) == IDOK)
    60. {
    61. EndDialog(hDlg, LOWORD(wParam));
    62. KillTimer(hDlg, 1);
    63. PostQuitMessage(0);
    64. return TRUE;
    65. }
    66. if (LOWORD(wParam) == IDCANCEL)
    67. {
    68. if (!IsDlgButtonChecked(hDlg, IDC_CHECK1)){CheckDlgButton(hDlg, IDC_CHECK1, BST_CHECKED);}
    69. if (!IsDlgButtonChecked(hDlg, IDC_RADIO1)){CheckDlgButton(hDlg, IDC_RADIO1, BST_CHECKED);}
    70. }
    71. if (LOWORD(wParam) == IDC_BUTTON4)
    72. {
    73. SendMessage(hDlg, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
    74. }
    75. if (LOWORD(wParam) == IDC_BUTTON3)
    76. {
    77. SendMessage(hDlg, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    78. }
    79. if (LOWORD(wParam) == IDC_BUTTON2)
    80. {
    81. SetWindowText(GetDlgItem(hDlg, IDC_EDIT1),"Message 1");
    82. SetWindowText(GetDlgItem(hDlg, IDC_EDIT2),"Message 2");
    83. SetWindowText(GetDlgItem(hDlg, IDC_EDIT3),"Message 3");
    84. }
    85. break;
    86. }
    87. return FALSE;
    88. }

    上面的代码包括对Edit文本框的操作,对Button的操作,对复选和Radio的操作,还用到了一个SYSTEMTIME结构和操作函数,让界面上的指示条随秒而动。对MFC的习练比WIN32功能多一些,编写程序比WIN32方便,但代码不如WIN32程序精练直接。

    祝福CSDN朋友们节日快乐,学业进步、职场升级,身体健康!

  • 相关阅读:
    学习总结1
    英语进阶指南:高效学习方法,提升英语水平 | 开源专题 No.35
    【云原生】Docker Compose初窥门径
    【Bun1.0】使用 Bun.js 构建快速、可靠和安全的 JavaScript 应用程序
    Java获取数组最大值、Java8的Arrays.sort()原理
    BUUCTF 刮开有奖 1
    Opencv算术操作
    基于spingboot的websocket订阅、广播、多人聊天室示例
    【数学建模】马氏链模型(Markov Chain)
    flask自定义序列化
  • 原文地址:https://blog.csdn.net/weixin_45707491/article/details/133591279