Форум программистов, компьютерный форум CyberForum.ru

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

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

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

26.10.2009, 17:31. Просмотров 947. Ответов 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
                }
}


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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 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, то закрашиваем фон, например, серым цветом.
Даемоник
41 / 41 / 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 ==========
CyBOSSeR
Эксперт C++
2299 / 1669 / 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.
Даемоник
41 / 41 / 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;
    }
}
Rififi
2336 / 1051 / 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
);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2009, 12:14     Неперекрашивается фон окна
Еще ссылки по теме:

C++ красивый фон программы
C++ Почему авторы диалоговых окон стараются сделать свои окна максимально похожими на стандартные окна?
цвет курсор и экран, фон C++
C++ Как в C++ поставить задний фон (например, картинку)?
Залить картинкой фон консоли C++

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

Или воспользуйтесь поиском по форуму:
Даемоник
41 / 41 / 3
Регистрация: 22.05.2009
Сообщений: 97
27.10.2009, 12:14  [ТС]     Неперекрашивается фон окна #7
Ну допустим, что у меня "помоешный" компилятор (Turbo C++). Исправить эти ошибки каким-нибудь образом возможно?
Yandex
Объявления
27.10.2009, 12:14     Неперекрашивается фон окна
Ответ Создать тему
Опции темы

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