Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 5

Win32 wm_ncpaint. Глюки в клиентской области окна

09.02.2016, 18:06. Показов 2627. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю интерфейс нужно сделать как photoshop на VS win32 без NET библиотек. так вот не клинская область глючит. Сам я еще очень плох в С++ и win32 Знаю только три языка. но они намного проще.
Код проекта. С AERO и DWM глючит.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "PMWVirtual.h"
////////////////////////////////////////////////////////////
#define IDM_MYMENURESOURCE 3
// Глобальные переменные
static TCHAR PmwMessengerClass[] = _T("WIN32API");
static TCHAR PmwTitle[] = _T("Planner Manager");
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Обработка данных нажатия кнопки между системой и програмным обеспечением LRESULT -константа 
//программа вызова и обработки окна
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPervInstance, LPSTR IpCmdline, int nCmdShow) //Начало функции рисования окна где HINSTANCE константа подключения
{
    
    // Характеристики окна
    WNDCLASSEX PmwStyle;
 
    PmwStyle.cbSize = sizeof(WNDCLASSEX);
    PmwStyle.style = CS_HREDRAW | CS_VREDRAW;
    PmwStyle.lpfnWndProc = WndProc;
    PmwStyle.cbClsExtra = 0;
    PmwStyle.cbWndExtra = 0;
    PmwStyle.hInstance = hInstance;
    PmwStyle.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PLANNER_MANAGER));
    PmwStyle.hCursor = LoadCursor(NULL, IDC_ARROW);
    PmwStyle.hbrBackground = CreateSolidBrush(RGB(227,227,227));
    PmwStyle.lpszMenuName = 0; //MAKEINTRESOURCE(IDM_MYMENURESOURCEI);
    PmwStyle.lpszClassName = PmwMessengerClass;
    PmwStyle.hIconSm = LoadIcon(PmwStyle.hInstance, MAKEINTRESOURCE(IDI_PLANNER_MANAGER));
    
    
        if (!RegisterClassEx(&PmwStyle))// ОШЫБКА ЕСЛИ СТИЛЬ НЕЗАГРУЖЕН
        {
            MessageBox(NULL, _T("Неудалось загрузить стиль"), _T("Win32 Guided Tour"), NULL);
            return 1;
        }
 
        hInst = hInstance; // Store instance handle in our global variable
 
        RECT PmwRect; // Задаем локальную переменную и вычисляем область экрана...
        GetWindowRect (GetDesktopWindow(), &PmwRect);
 
    //  HWND PmwWinCr = CreateWindow(PmwMessengerClass, PmwTitle, WS_POPUPWINDOW , 0, 0, //PmwRect.left + (PmwRect.right - PmwRect.left - 700) / 2,
                                                                                            //PmwRect.top + (PmwRect.bottom - PmwRect.top - 500) / 2,
        //  GetSystemMetrics(SM_CXMAXIMIZED), GetSystemMetrics(SM_CYMAXIMIZED), NULL, NULL, hInstance, NULL);
        // Создаем переменную для окна и присваеваем ей значение, и в следствии создаем окно.
        //WS_стиль без рамки
 
        HWND PmwWinCr = CreateWindowEx(WS_EX_STATICEDGE, PmwMessengerClass, PmwTitle,WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_POPUP | WS_SIZEBOX | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
            PmwRect.left + (PmwRect.right - PmwRect.left - 700) / 2, PmwRect.top + (PmwRect.bottom - PmwRect.top - 500) / 2, 700, 500, NULL, NULL, hInstance, NULL);
        //SetWindowLong(PmwWinCr, GWL_STYLE, GetWindowLong(PmwWinCr, GWL_STYLE)&(~WS_CAPTION));
        if (!PmwWinCr) //ОШИБКА ЕСЛИ ОКНО НЕ СОЗДАННО
        {
            MessageBox(NULL, _T("Неудалось создать окно"), _T("Win32 Guided Tour"), NULL);
            return 1;
        }
        // Отображаем окно
        //ShowWindow(PmwWinCr, nCmdShow); // показываем окно где PmwWin переменная создания окна
        // а nCmdShow переменная числа функции инициализации
        //ShowWindow(PmwWinCr, SW_SHOWMAXIMIZED);   //  Окно в развернутом состоянии                   
        UpdateWindow(PmwWinCr);         // Обновляем Окно
        
        
    // Main message loop:
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
 
    return (int)msg.wParam;
}
//ДОДЕЛАТЬ
///////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR greeting[] = _T("");
 
    switch (message)
    {
    case WM_NCPAINT:
    {
        HDC thdc;
        RECT rect;
        HBRUSH b;
        HPEN pe;
        
 
        thdc = GetDCEx(hWnd, (HRGN)wParam, DCX_WINDOW | DCX_CACHE | DCX_INTERSECTRGN | DCX_LOCKWINDOWUPDATE);
        GetWindowRect(hWnd, &rect);
        b = CreateSolidBrush(RGB(0, 0, 180));
        SelectObject(thdc, b);
        pe = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
        SelectObject(thdc, pe);
        Rectangle(thdc, 0, 0, (rect.right - rect.left), (rect.bottom - rect.top));
        DeleteObject(pe);
        DeleteObject(b);
 
        ReleaseDC(hWnd, thdc);
        RedrawWindow(hWnd, &rect, (HRGN)wParam, RDW_UPDATENOW);
        break;
        
    }
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
 
        // Here your application is laid out.
        // For this introduction, we just print out "Hello, World!"
        // in the top left corner.
        TextOut(hdc,
            5, 5,
            greeting, _tcslen(greeting));
        // End application-specific layout section.
 
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
 
    return 0;
}
Подскажите пожалуйста мне нужно получить титл бар как в фотошопе и VS кнопки свернуть, закрыть и.т.д при этом старые виндоус должны так же это запускать win2000, millenium, xp sp1 и пр.
Вплоть до 10.... Очень буду благодарен за открытый рабочий проект готов заплатить. можно через фрилансер. через чистую сделку не получиться т.к уже один гений взял 50% и исчез))
https://www.fl.ru/projects/264... -2013.html

Или подскажите где у меня ошибка, я так и не смог найти не на английских сайта не в группах facebook адекватных примеров максимум скрывали не клинскую панель и рисовали заного свою. С обработчиками. а вот через NC_WMPAINT адекватно так и несмогли реализовать хотя. Что QT что XAMLL обращаются к WIN32 и там это достаточно просто реализовать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2016, 18:06
Ответы с готовыми решениями:

Как получить размеры клиентской области окна-родителя в функции дочернего окна?
задание такое: имеется дочернее окно,которое "убегает" от курсора мыши в пределах родительского окна. я создала главное окно,и дочернее,...

Цвет клиентской области окна
Доброго времени суток. Вообще я хочу правильно раскрасить окно при нажатии мышки. Код из главной оконной процедуры: ...

Получить снимок клиентской области окна и цвет пикселя
Всем привет, не шибко знаю С++, но есть две задачи 1. Нужно получить снимок клиентской области окна, притом возможно не активного или...

4
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
10.02.2016, 15:40
Например у меня нет ни фотошопа ни VS. Скриншоты бы. Того что надо и того что не получается. Какие именно "глюки"-то? Ни в теме ни по ссылке не нашёл картинок.
Думаю не стоит вызывать перерисовку внутри обработки *PAINT сообщений. Да и у Аэро есть ряд фокусов.
0
0 / 0 / 0
Регистрация: 04.07.2015
Сообщений: 5
10.02.2016, 16:34  [ТС]
Да конечно простите... Я сылку кинул на фриланс там картинки были но если надо вот, то что нужно

то что у меня

код я вам скинул это основной там просто пару констант нехватает а так работает и получается то что на скрине 2

Добавлено через 7 минут
А глюки 1 нету кнопок закрыть свернуть и.т.д 2й если вот это зелененькое окно прикрыть любым другим окном то оно становиться как аеро пока его не свернуть и не развернуть, заново.... А мне нужен не видимый титл бар т.е допустим он на win 2000 будет выглядеть так же как и на win 2010 и независимо от того включено aero в 2010 или нет. Т.е это реально несложно если знать, про wm_ncpaint очень мало информации и в документации тоже. Хотя используется уже на win достаточно давно..

Добавлено через 3 минуты
С aero есть DWM и с ним не сложно работать но вся соль в том, что в XP,2000 его нет следовательно если я буду пытаться сделать с ним что то, то там он работать не будет, и я зря потрачу время а paint прекрасно красит титл бар, но только это и глючит ( он красит все. и то что нужно и то что ненужно...
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
10.02.2016, 18:40

Не по теме:

Вероятно незарегистрированным посетителям не показываются приложенные файлы.


  • Вариант 1 - отключаем Aero через DwmSetWindowAttribute для своего окна и рисуем на заголовке по-старинке в WM_NCPAINT.
  • Вариант 2 - разрешаем рисовать поверх Aero (через это же, видимо у вас так и сделано?) но не уверен что будет с кнопками, удастся ли их "оставить в целости".
  • Вариант 3 - убираем верхнюю рамку строго до нуля через WM_NCCALCSIZE и рисуем всё что хотели в обычном WM_PAINT.

А красит у вас именно то что вы и задали красить - весь прямоугольник заливается цветом.

Добавлено через 3 минуты
В 3-м варианте понадобится ещё какую-то Dwm* кинуть на окно, чтоб условно расширить рамку обратно и чтоб кнопки сохранились.
0
Почетный модератор
Эксперт по компьютерным сетямЭксперт Windows
 Аватар для magirus
28049 / 15785 / 983
Регистрация: 15.09.2009
Сообщений: 67,752
Записей в блоге: 78
11.02.2016, 13:17
создано во фрилансе, здесь закрыто.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2016, 13:17
Помогаю со студенческими работами здесь

Как определить размер клиентской области окна Access?
Хочу при запуске растягивать форму по вертикали. По горизонтали не менять, т.е. это не максимизация. Может у кого есть код опредения...

Координаты курсора мыши относительно клиентской области окна
Здравствуйте! Подскажите пожалуйста как можно узнать координаты курсора мыши клиенской области окна! Знаю и юзал функциию ...

Как помимо сообщения WM_SIZE получить размеры клиентской области окна?
Как помимо сообщения WM_SIZE получить размеры клиенсткой области окна?

Рост и полет мыльного пузыря в клиентской области окна с использованием метафайлов
Привет, форумчане. Срочно нужна помощь по лабораторной на С ++ WinAPI на завтра. Сам сделать никак не могу. Вот задание: рост и полет...

Размер клиентской области
Всем привет! Как можно узнать размер клиентской области? Я имею ввиду тот размер, который займет контрол, если ему установить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Закрытая тема Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru