Можно ли создать полноценный GUI - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Мне стало интересно, можно ли создавать программы на C с полноценным GUI, и какими средствами? Заранее спасибо)

Решение задачи: «Можно ли создать полноценный GUI»

textual
Листинг программы
  1. #define WIN32_LEAN_AND_MEAN  /* speed up compilations */
  2. #include <windows.h>
  3. #include <windowsx.h>
  4. #include <commctrl.h>
  5. #include <tchar.h>
  6. #include "main.h"
  7. #define NELEMS(a)  (sizeof(a) / sizeof((a)[0]))
  8. static LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM);
  9. static void Main_OnPaint(HWND);
  10. static void Main_OnCommand(HWND, int, HWND, UINT);
  11. static void Main_OnDestroy(HWND);
  12. static LRESULT WINAPI AboutDlgProc(HWND, UINT, WPARAM, LPARAM);
  13.  
  14. static HANDLE ghInstance;
  15. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
  16. {
  17.     INITCOMMONCONTROLSEX icc;
  18.     WNDCLASS wc;
  19.     HWND hwnd;
  20.     MSG msg;
  21.  
  22.     ghInstance = hInstance;
  23.     icc.dwSize = sizeof(icc);
  24.     icc.dwICC = ICC_WIN95_CLASSES;
  25.     InitCommonControlsEx(&icc);
  26.     wc.lpszClassName = _T("wwClass");
  27.     wc.lpfnWndProc = MainWndProc;
  28.     wc.style = CS_OWNDC|CS_VREDRAW|CS_HREDRAW;
  29.     wc.hInstance = ghInstance;
  30.     wc.hIcon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDR_ICO_MAIN));
  31.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  32.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  33.     wc.lpszMenuName = MAKEINTRESOURCE(IDR_MNU_MAIN);
  34.     wc.cbClsExtra = 0;
  35.     wc.cbWndExtra = 0;
  36.     if (!RegisterClass(&wc))
  37.         return 1;
  38.  
  39.     hwnd = CreateWindow(_T("wwClass"),
  40.         _T("ww Program"),
  41.         WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
  42.         0,
  43.         0,
  44.         CW_USEDEFAULT,
  45.         CW_USEDEFAULT,
  46.         NULL,
  47.         NULL,
  48.         ghInstance,
  49.         NULL
  50.     );
  51.     if (!hwnd) return 1;
  52.     ShowWindow(hwnd, nCmdShow);
  53.     UpdateWindow(hwnd);
  54.  
  55.  
  56. #if 0
  57.  
  58.     for (;;)
  59.     {
  60.         BOOL fRet = GetMessage(&msg, NULL, 0, 0);
  61.         if (fRet == -1)  /* Error */
  62.         {
  63.             __debugbreak();
  64.             return -1;
  65.         }
  66.         else if (fRet == 0)  /* WM_QUIT */
  67.         {
  68.             break;
  69.         }
  70.         else  
  71.         {
  72.             TranslateMessage(&msg);
  73.             DispatchMessage(&msg);
  74.         }
  75.     }
  76. #else
  77.     while (GetMessage(&msg, NULL, 0, 0))
  78.     {
  79.         TranslateMessage(&msg);
  80.         DispatchMessage(&msg);
  81.     }
  82. #endif
  83.  
  84.     return msg.wParam;
  85. }
  86. static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  87. {
  88.     switch (msg)
  89.     {
  90.         HANDLE_MSG(hwnd, WM_PAINT, Main_OnPaint);
  91.         HANDLE_MSG(hwnd, WM_COMMAND, Main_OnCommand);
  92.         HANDLE_MSG(hwnd, WM_DESTROY, Main_OnDestroy);
  93.         default:
  94.             return DefWindowProc(hwnd, msg, wParam, lParam);
  95.     }
  96. }
  97. static void Main_OnPaint(HWND hwnd)
  98. {
  99.     PAINTSTRUCT ps;
  100.     RECT rc;
  101.  
  102.     BeginPaint(hwnd, &ps);
  103.     GetClientRect(hwnd, &rc);
  104.     DrawText(ps.hdc, _T("Hello, World!"), -1, &rc, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  105.     EndPaint(hwnd, &ps);
  106. }
  107. static void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
  108. {
  109.     switch (id)
  110.     {
  111.         case IDM_ABOUT:
  112.             DialogBox(ghInstance, MAKEINTRESOURCE(DLG_ABOUT), hwnd, (DLGPROC)AboutDlgProc);
  113.     }
  114. }
  115. static void Main_OnDestroy(HWND hwnd)
  116. {
  117.     PostQuitMessage(0);
  118. }
  119.  
  120.  
  121. static LRESULT CALLBACK AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  122. {
  123.     switch (uMsg)
  124.     {
  125.         case WM_INITDIALOG:
  126.             return TRUE;
  127.  
  128.         case WM_COMMAND:
  129.             switch (wParam)
  130.             {
  131.                 case IDOK:
  132.                 case IDCANCEL:
  133.                     EndDialog(hDlg, TRUE);
  134.                     return TRUE;
  135.             }
  136.             break;
  137.     }
  138.  
  139.     return FALSE;
  140. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы