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

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

09.02.2016, 18:06. Показов 1476. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2016, 18:06
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

Не по теме:

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


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

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

Добавлено через 3 минуты
В 3-м варианте понадобится ещё какую-то Dwm* кинуть на окно, чтоб условно расширить рамку обратно и чтоб кнопки сохранились.
0
Почетный модератор
Эксперт по компьютерным сетямЭксперт Windows
28023 / 15750 / 971
Регистрация: 15.09.2009
Сообщений: 67,775
Записей в блоге: 78
11.02.2016, 13:17 5
создано во фрилансе, здесь закрыто.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2016, 13:17

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.