Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для Даемоник
42 / 42 / 8
Регистрация: 22.05.2009
Сообщений: 97

Неперекрашивается фон окна

26.10.2009, 17:31. Показов 1442. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возможно я пишу не в ту ветку, но мне бы хотелось узнать как можно решить такого рода проблему: я изучаю win32 решил попробовать написать программу, меняющую цвет фона окна.

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

Test.cpp
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
#include "Test.h"
 
HBRUSH hBlueBrush,hGreenBrush;
int sw;
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    char szClassName[]="Main Window";
    char szTitle[]="Программа";
    MSG msg;
    WNDCLASS wc;
 
    ZeroMemory(&wc,sizeof(wc));
    wc.lpfnWndProc=WndProc;
    wc.hInstance=hInst;
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.lpszMenuName="Main";
    wc.lpszClassName=szClassName;
    RegisterClass(&wc);
 
    HWND hwnd=CreateWindow(szClassName,szTitle,
        WS_OVERLAPPEDWINDOW, 10,10,200,100,
        HWND_DESKTOP,NULL,hInst,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);
 
    while(GetMessage(&msg,NULL,0,0))
        DispatchMessage(&msg);
    return 0;
}
 
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,
            WPARAM wParam,LPARAM lParam)
{
    switch(msg){
        HANDLE_MSG(hwnd,WM_COMMAND,OnCommand);
        HANDLE_MSG(hwnd,WM_CREATE,OnCreate);
        HANDLE_MSG(hwnd,WM_PAINT,OnPaint);
        HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);
        default:
            return (DefWindowProc(hwnd,msg,wParam,lParam));
        }
}
 
BOOL OnCreate(HWND,LPCREATESTRUCT)
{
    hBlueBrush=CreateSolidBrush(RGB(100,100,255));
    hGreenBrush=CreateSolidBrush(RGB(100,255,100));
    return TRUE;
}
 
void OnCommand(HWND hwnd, int id, HWND, UINT)
{
    switch(id)
    {
        case MI_BLUE:
            sw=1;
            InvalidateRect(hwnd,NULL,TRUE);
            break;
        case MI_GREEN:
            sw=2;
            InvalidateRect(hwnd,NULL,TRUE);
            break;
        case MI_EXIT:
            DestroyWindow(hwnd);
    }
}
 
void OnPaint(HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc=BeginPaint(hwnd,&ps);
    if(1==sw)
        FillRect(hdc,&ps.rcPaint,hBlueBrush);
    if(2==sw)
        FillRect(hdc,&ps.rcPaint,hGreenBrush);
    EndPaint(hwnd,&ps);
}
 
void OnDestroy(HWND)
{
    PostQuitMessage(0);
}

Test.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <windows.h>
#include <windowsx.h>
 
#define MI_BLUE 100
#define MI_GREEN 101
#define MI_EXIT 102
 
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL OnCreate(HWND, LPCREATESTRUCT);
void OnPaint(HWND);
void OnCommand(HWND,int,HWND,UINT);
void OnDestroy(HWND);

Test.rc
C++
1
2
3
4
5
6
7
8
9
10
#include "Test.h"
 
Main Menu{
        POPUP "&Фон"{
                MENUITEM "&Blue",MI_BLUE
                MENUITEM "&Green",MI_GREEN
                MENUITEM SEPARATOR
                MENUITEM "&EXIT",MI_EXIT
                }
}


Скрины программы:
Миниатюры
Неперекрашивается фон окна   Неперекрашивается фон окна   Неперекрашивается фон окна  

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.10.2009, 17:31
Ответы с готовыми решениями:

Фон окна консольной программы
Вобщем вопрос такой. Я работаю в Visual Studio 2010 и коды для цвета фона или текста которые идут в Borland сдесь не пойдут. Я хотел...

При компиляции под WinXP фон окна светлее, чем фон контролов
Сабж собственно: Почему?

Прозрачный фон иконки и фон диалогового окна
Делаю всё в VS 2010, mfc! 1)Как поставить вместо стандартного фона диалогового окна, свой фон, например картинку? 2)Как сделать так...

6
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
26.10.2009, 17:39
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ...
int sw;  // sw при запуске принимает нулевое значение
 
// ...
void OnPaint(HWND hwnd)
{
        // ...
        // Ниже ты нулевое значение никак не обрабатываешь - поэтому фон при запуске не рисуется вообще
        if(1==sw)
                FillRect(hdc,&ps.rcPaint,hBlueBrush);
        if(2==sw)
                FillRect(hdc,&ps.rcPaint,hGreenBrush);
        // ..
}
Либо изначально присвой переменной sw какое либо значение (1 или 2), тогда при открытии программы будет либо голубой либо зеленый фон. Или в обработчике WM_PAINT задай условие что если sw ни 1, ни 0, то закрашиваем фон, например, серым цветом.
1
 Аватар для Даемоник
42 / 42 / 8
Регистрация: 22.05.2009
Сообщений: 97
26.10.2009, 17:51  [ТС]
А еще такой вопрос: Почему при запуске из-под visual studio начинают вылезать ошибки вроде таких?

Вывод
------ Построение начато: проект: Test, Конфигурация: Debug Win32 ------
Компиляция...
Test.cpp
d:\documents and settings\администратор\мои документы\visual studio 2008\projects\test\test\test.cpp(18) : error C2440: =: невозможно преобразовать 'const char [5]' в 'LPCWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
d:\documents and settings\администратор\мои документы\visual studio 2008\projects\test\test\test.cpp(19) : error C2440: =: невозможно преобразовать 'char [12]' в 'LPCWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
d:\documents and settings\администратор\мои документы\visual studio 2008\projects\test\test\test.cpp(24) : error C2664: CreateWindowExW: невозможно преобразовать параметр 2 из 'char [12]' в 'LPCWSTR'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
Журнал построения был сохранен в "file://d:\Documents and Settings\Администратор\Мои документы\Visual Studio 2008\Projects\Test\Test\Debug\BuildLog.h tm"
Test - ошибок 3, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
26.10.2009, 19:04
Цитата Сообщение от Даемоник Посмотреть сообщение
А еще такой вопрос: Почему при запуске из-под visual studio начинают вылезать ошибки вроде таких?

d:\documents and settings\администратор\мои документы\visual studio 2008\projects\test\test\test.cpp(19) : error C2440: =: невозможно преобразовать 'char [12]' в 'LPCWSTR'
Дело в том что у тебя в настройках проекта установлено использование символов Unicode (широкие символы по 2 байта на символ), а ты используешь символы ANSI (по 1 байту на символ).
Когда Unicode включен все Windows-функции ожидают строки из широких символов, а ты передаешь им обычные строки. Вот компилятор и ругается.
Отключи в настройках использование Unicode и все будет нормально.
1. В главном меню Project->Properties.
2. В открывшемся окне Configurations Properties->General.
3. Свойство Character Set устанавливаешь в Not Set.
1
 Аватар для Даемоник
42 / 42 / 8
Регистрация: 22.05.2009
Сообщений: 97
27.10.2009, 00:09  [ТС]
Продолжил изучение, захотелось добавить опцию "About". Но при создании диалогового окна возникает 2 ошибки..

Проблемный кусок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void OnCommand(HWND hwnd, int id, HWND, UINT)
{
    switch(id)
    {
        case MI_BLUE:
            sw=1;
            InvalidateRect(hwnd,NULL,TRUE);
            break;
        case MI_GREEN:
            sw=2;
            InvalidateRect(hwnd,NULL,TRUE);
            break;
        case MI_ABOUT:
    //Ошибка вылезает здесь
            DialogBox(hInstance,"About",hwnd,DlgProc);
            break;
        case MI_EXIT:
            DestroyWindow(hwnd);
    }
}

А ошибки вот такие..
[C++ Error] Test.cpp(67): E2034 Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()'
[C++ Error] Test.cpp(67): E2342 Type mismatch in parameter 'lpDialogFunc' (wanted 'int (__stdcall *)()', got 'int (__stdcall *)(void *,unsigned int,unsigned int,long)')


Собственно получается, что он ругается на функцию
DlgProc()
C++
1
2
3
4
5
6
7
8
9
BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam,LPARAM lParam)
{
    switch(msg){
    HANDLE_MSG(hwnd,WM_INITDIALOG,DlgOnInitDialog);
    HANDLE_MSG(hwnd,WM_COMMAND,DlgOnCommand);
    default:
    return FALSE;
    }
}
0
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
27.10.2009, 00:39
Даемоник,
у тебя какой-то помоешнный компилятор
В правильных компиляторах тип DLGPROC соответствует таком прототипу:

Code
1
2
3
4
5
6
INT_PTR CALLBACK DialogProc(
    HWND hwndDlg,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);
1
 Аватар для Даемоник
42 / 42 / 8
Регистрация: 22.05.2009
Сообщений: 97
27.10.2009, 12:14  [ТС]
Ну допустим, что у меня "помоешный" компилятор (Turbo C++). Исправить эти ошибки каким-нибудь образом возможно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2009, 12:14
Помогаю со студенческими работами здесь

Сменить фон окна при выборе пункта меню"сменить фон" с использованием winapi
Сразу к делу: Первая часть задания готова.Но вто где нужно сменить фон я заступорился.В обработчике события выбора в меню пункта...

Фон окна
Вопрос: как поменять фон окна папки например вот так

Фон окна - рисунок
Как так сделать, если при объявление класса окна, есть &quot;hbrBackground&quot; но там только кистями, а загрузка рисунка нет? и как можно...

Размытый фон окна
Собственно мой вопрос: как сделать размытым фон окна (не только под рамкой, но и под всем окном)? Гуглил, гуглил :wall: - не помогло,...

Фон главного окна
Как Можно поставить картинку в фон главного окна???


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru