Можно ли создать полноценный GUI - C (СИ)
Формулировка задачи:
Мне стало интересно, можно ли создавать программы на C с полноценным GUI, и какими средствами?
Заранее спасибо)
Решение задачи: «Можно ли создать полноценный GUI»
textual
Листинг программы
- #define WIN32_LEAN_AND_MEAN /* speed up compilations */
- #include <windows.h>
- #include <windowsx.h>
- #include <commctrl.h>
- #include <tchar.h>
- #include "main.h"
- #define NELEMS(a) (sizeof(a) / sizeof((a)[0]))
- static LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM);
- static void Main_OnPaint(HWND);
- static void Main_OnCommand(HWND, int, HWND, UINT);
- static void Main_OnDestroy(HWND);
- static LRESULT WINAPI AboutDlgProc(HWND, UINT, WPARAM, LPARAM);
- static HANDLE ghInstance;
- int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
- {
- INITCOMMONCONTROLSEX icc;
- WNDCLASS wc;
- HWND hwnd;
- MSG msg;
- ghInstance = hInstance;
- icc.dwSize = sizeof(icc);
- icc.dwICC = ICC_WIN95_CLASSES;
- InitCommonControlsEx(&icc);
- wc.lpszClassName = _T("wwClass");
- wc.lpfnWndProc = MainWndProc;
- wc.style = CS_OWNDC|CS_VREDRAW|CS_HREDRAW;
- wc.hInstance = ghInstance;
- wc.hIcon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDR_ICO_MAIN));
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wc.lpszMenuName = MAKEINTRESOURCE(IDR_MNU_MAIN);
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- if (!RegisterClass(&wc))
- return 1;
- hwnd = CreateWindow(_T("wwClass"),
- _T("ww Program"),
- WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
- 0,
- 0,
- CW_USEDEFAULT,
- CW_USEDEFAULT,
- NULL,
- NULL,
- ghInstance,
- NULL
- );
- if (!hwnd) return 1;
- ShowWindow(hwnd, nCmdShow);
- UpdateWindow(hwnd);
- #if 0
- for (;;)
- {
- BOOL fRet = GetMessage(&msg, NULL, 0, 0);
- if (fRet == -1) /* Error */
- {
- __debugbreak();
- return -1;
- }
- else if (fRet == 0) /* WM_QUIT */
- {
- break;
- }
- else
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- #else
- while (GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- #endif
- return msg.wParam;
- }
- static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch (msg)
- {
- HANDLE_MSG(hwnd, WM_PAINT, Main_OnPaint);
- HANDLE_MSG(hwnd, WM_COMMAND, Main_OnCommand);
- HANDLE_MSG(hwnd, WM_DESTROY, Main_OnDestroy);
- default:
- return DefWindowProc(hwnd, msg, wParam, lParam);
- }
- }
- static void Main_OnPaint(HWND hwnd)
- {
- PAINTSTRUCT ps;
- RECT rc;
- BeginPaint(hwnd, &ps);
- GetClientRect(hwnd, &rc);
- DrawText(ps.hdc, _T("Hello, World!"), -1, &rc, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
- EndPaint(hwnd, &ps);
- }
- static void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
- {
- switch (id)
- {
- case IDM_ABOUT:
- DialogBox(ghInstance, MAKEINTRESOURCE(DLG_ABOUT), hwnd, (DLGPROC)AboutDlgProc);
- }
- }
- static void Main_OnDestroy(HWND hwnd)
- {
- PostQuitMessage(0);
- }
- static LRESULT CALLBACK AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch (uMsg)
- {
- case WM_INITDIALOG:
- return TRUE;
- case WM_COMMAND:
- switch (wParam)
- {
- case IDOK:
- case IDCANCEL:
- EndDialog(hDlg, TRUE);
- return TRUE;
- }
- break;
- }
- return FALSE;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д