Новичок
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 29.9.2015
Репутация: нет Всего: нет
|
| Цитата(xvr @ 29.9.2015, 11:19) | Для начала - оформляйте код как код, а не как простыню текста. Уважайте тех, кто это будет читать (и возможно помогать вам).
По сути вопроса - есть как минимум 2 варианта:
- Сделать разные окна (разные классы и разные оконные процедуры)
- Передать окну при создании дополнительный параметр, по которому оконная процедура будет разбираться, что нужно рисовать. См. SetWindowLongPtr с параметром GWLP_USERDATA
|
спасибо, код почистила, извините)) все работает | Код | #include "stdafx.h" #include "Win32Project10.h" #include <windows.h> #define _USE_MATH_DEFINES #include <cmath> #define CIRCLE_CX 150.0 #define CIRCLE_CY 150.0 #define CIRCLE_BIG_RADIUS 100.0 #define CIRCLE_SMALL_RADIUS 40.0 #define ANGLE_COUNT 5 #define ID_BUTTON1 100 #define ID_BUTTON2 200 #define ID_BUTTON3 300 #define ID_CHILD1 1500 #define ID_CHILD2 1501
// --- Описание функции главного окна LRESULT CALLBACK main_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);//(СALLBACK - паскалевское соглашение о способе передаче параметров) LRESULT CALLBACK child_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);//(СALLBACK - паскалевское соглашение о способе передаче параметров)
HINSTANCE hInst; // --- Глобальные переменные
TCHAR main_ClassName[] = L"MainWindows"; // Название класса окна TCHAR child_ClassName[] = L"ChildWindows";
TCHAR main_app_name[] = L"OVERLAPPEDWINDOW"; // Название класса окна TCHAR popup_app_name[] = L"POPUPWINDOW"; TCHAR child_app_name[] = L"CHILDWINDOW";
// --- Функция WinMain int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASS main_wc, popup_wc, child_wc, child_wc1;
HWND main_hWnd; MSG msg; memset(&main_wc, 0, sizeof(main_wc)); memset(&popup_wc, 0, sizeof(popup_wc)); memset(&child_wc, 0, sizeof(child_wc));
main_wc.lpszClassName = main_ClassName; main_wc.lpfnWndProc = (WNDPROC)main_WndProc; main_wc.style = CS_HREDRAW | CS_VREDRAW;//стили класса окна Перерисовывает все окно , если регулятор движения или размер изменения высоты клиентской области. main_wc.hInstance = hInstance; main_wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); main_wc.hCursor = LoadCursor(NULL, IDC_ARROW); main_wc.hbrBackground = CreateSolidBrush(RGB(20, 150, 1000)); main_wc.lpszMenuName = NULL; main_wc.cbClsExtra = 0; main_wc.cbWndExtra = 0; RegisterClass(&main_wc);
child_wc.lpszClassName = child_ClassName; child_wc.lpfnWndProc = (WNDPROC)child_WndProc; child_wc.style = CS_HREDRAW | CS_VREDRAW; child_wc.hInstance = hInstance; child_wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); child_wc.hCursor = LoadCursor(NULL, IDC_ARROW); child_wc.hbrBackground = CreateSolidBrush(RGB(0, 255, 0)); child_wc.lpszMenuName = NULL; child_wc.cbClsExtra = 0; child_wc.cbWndExtra = 0; RegisterClass(&child_wc);
main_hWnd = CreateWindow( main_ClassName, // Имя класса окон main_app_name, // Заголовок окна WS_OVERLAPPEDWINDOW |WS_CLIPCHILDREN, // Стиль окна CW_USEDEFAULT, // X-координаты CW_USEDEFAULT, // Y-координаты CW_USEDEFAULT, // Ширина окна CW_USEDEFAULT, // Высота окна NULL, // Дескриптор окна-родителя NULL, // Дескриптор меню окна hInstance, // Дескриптор экземпляра приложения NULL); // Дополнительная информация if (main_hWnd == 0) { return FALSE; } ShowWindow(main_hWnd, nCmdShow); UpdateWindow(main_hWnd);
while (GetMessage(&msg, NULL, 0, 0)) //(NULL - дикриптор окна из которого принимать сообщения) { TranslateMessage(&msg); DispatchMessage(&msg); }
return msg.wParam; // возвращает значение последнего обработанного сообщения }
// --- Функция окна LRESULT CALLBACK main_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; HWND hButton, hButton1, hButton2; switch (msg) { case WM_CREATE: hButton = CreateWindow(L"button", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP | BS_PUSHBUTTON, 400, 12, 200, 150, hWnd, (HMENU)ID_BUTTON1, hInst, NULL); hButton1 = CreateWindow(L"button", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 400, 162, 200, 150, hWnd, (HMENU)ID_BUTTON2, hInst, NULL); hButton2 = CreateWindow(L"button", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 400, 312, 200, 150, hWnd, (HMENU)ID_BUTTON3, hInst, NULL); case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); if (LOWORD(wParam) == ID_BUTTON1) { HWND child_hWnd1 = CreateWindow(child_ClassName, _T("Child1"), WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 20, 30, 300, 300, hWnd, (HMENU)ID_CHILD1, hInst, NULL); ShowWindow(child_hWnd1, SW_NORMAL); UpdateWindow(child_hWnd1); SetWindowLongPtr(child_hWnd1, GWLP_USERDATA, (LONG)child_WndProc); break; } if (LOWORD(wParam) == ID_BUTTON2) { HWND child_hWnd2 = CreateWindow(child_ClassName1, _T("Child2"), WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 700, 200, 400, 400, hWnd, (HMENU)ID_CHILD2, hInst, NULL); ShowWindow(child_hWnd2, SW_NORMAL); UpdateWindow(child_hWnd2); break; } if (LOWORD(wParam) == ID_BUTTON3) { HWND child_hWnd3 = CreateWindow(child_ClassName, _T("Child3"), WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 400, 300, 400, 400, hWnd, NULL, hInst, NULL); ShowWindow(child_hWnd3, SW_NORMAL); UpdateWindow(child_hWnd3); break; } switch (wParam) {
}
case WM_PAINT: {
// PAINTSTRUCT ps; // EndPaint(hWnd, &ps); }; break;
case WM_DESTROY: { PostQuitMessage(0); }; break;
default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0l; }
LRESULT CALLBACK child_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps; HDC hdc; switch (msg) {
case WM_PAINT: { LONG whatToDraw=GetWindowLongPtr(child_hWnd1, GWLP_USERDATA) hdc = BeginPaint(hWnd, &ps); POINT oldpoint; HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)), hOldPen; HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 255)), hOldBrush; hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); hOldPen = (HPEN)SelectObject(hdc, hPen);
double shift = 360.0 / ANGLE_COUNT; double dbshift = shift / 2.0; double x = -180.0; MoveToEx(hdc, CIRCLE_CX + CIRCLE_BIG_RADIUS*sin(double(x*M_PI) / 180.0), CIRCLE_CY + CIRCLE_BIG_RADIUS*cos(double(x*M_PI) / 180.0), &oldpoint); for (; x <= 180.0; x += shift){ LineTo(hdc, CIRCLE_CX + CIRCLE_BIG_RADIUS*sin(double(x*M_PI) / 180.0), CIRCLE_CY + CIRCLE_BIG_RADIUS*cos(double(x*M_PI) / 180.0)); LineTo(hdc, CIRCLE_CX + CIRCLE_SMALL_RADIUS*sin(double((x + dbshift)*M_PI) / 180.0), CIRCLE_CY + CIRCLE_SMALL_RADIUS*cos(double((x + dbshift)*M_PI) / 180.0)); } ExtFloodFill(hdc, CIRCLE_CX, CIRCLE_CY, RGB(255, 0, 0), FLOODFILLBORDER); MoveToEx(hdc, oldpoint.x, oldpoint.y, &oldpoint); SelectObject(hdc, hOldPen); DeleteObject(hPen); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); EndPaint(hWnd, &ps); break; } } switch (msg) {
case WM_DESTROY: { PostQuitMessage(0); }; break;
case WM_MOVE: { InvalidateRect(hWnd, NULL, TRUE); UpdateWindow(hWnd); }break;
default: return DefWindowProc(hWnd, msg, wParam, lParam); //реализует поведение по умолчанию типичного окна верхнего уровня. } return 0l; }
|
Это сообщение отредактировал(а) feodorv - 29.9.2015, 15:27
|