Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Даемоник
42 / 42 / 3
Регистрация: 22.05.2009
Сообщений: 97
#1

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

26.10.2009, 17:31. Просмотров 991. Ответов 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
Миниатюры
Неперекрашивается фон окна   Неперекрашивается фон окна   Неперекрашивается фон окна  

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2009, 17:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неперекрашивается фон окна (C++):

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

Не вижу окна с кодом (нет окна редактирования): найти причины странного поведения программы - C++
Создаю проект, а кроме синего экрана ничего больше нет, не знаю, что делать. Прочла здесь же про образователь решений(типа должен быть...

Почему авторы диалоговых окон стараются сделать свои окна максимально похожими на стандартные окна? - C++
Начал рассматривать множество программ на С++ и заметил, что программисты стараются сделать почти все диалоговые окна максимально похожими...

поиск Handle окна, зная ControlId окна - C++
вопрос по сабжу

Подскажите функцию для получения HWND текущего окна, или по названию окна (для экспорта в VFP6) - C++
пусто

Как запретить сворачивание окна приложения при нажатии кнопки "свернуть все окна" - C++
Что происходит при нажатии этой кнопки в плане сообщениий, и как их перехватить и игнорировать,что бы окно не сворачивалось? Чем это...

6
CyBOSSeR
Эксперт С++
2307 / 1680 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
26.10.2009, 17:39 #2
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 / 3
Регистрация: 22.05.2009
Сообщений: 97
26.10.2009, 17:51  [ТС] #3
А еще такой вопрос: Почему при запуске из-под 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.htm"
Test - ошибок 3, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
CyBOSSeR
Эксперт С++
2307 / 1680 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
26.10.2009, 19:04 #4
Цитата Сообщение от Даемоник Посмотреть сообщение
А еще такой вопрос: Почему при запуске из-под 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 / 3
Регистрация: 22.05.2009
Сообщений: 97
27.10.2009, 00:09  [ТС] #5
Продолжил изучение, захотелось добавить опцию "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
Rififi
2360 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
27.10.2009, 00:39 #6
Даемоник,
у тебя какой-то помоешнный компилятор
В правильных компиляторах тип DLGPROC соответствует таком прототипу:

Код
INT_PTR CALLBACK DialogProc(
    HWND hwndDlg,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);
1
Даемоник
42 / 42 / 3
Регистрация: 22.05.2009
Сообщений: 97
27.10.2009, 12:14  [ТС] #7
Ну допустим, что у меня "помоешный" компилятор (Turbo C++). Исправить эти ошибки каким-нибудь образом возможно?
0
27.10.2009, 12:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2009, 12:14
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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