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

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

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

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

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


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

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2009, 17:31     Неперекрашивается фон окна
Посмотрите здесь:

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

Прозрачный фон. - C++
Здравствуйте, помогите пожалуйста. Моя программа создает диалоговое окно но оно создается с прозрачным фоном и почему-то при нажатии на...

красивый фон программы - C++
Всем привет, помогите пожалуйста,нужно сделать на прогу красивый фон из каких нибудь узоров или прочего чтобы смотрелось красива, кто...

Прозрачный фон у RaddioButton - C++
Скажите пожалуйста как можно зделать прозрачный фон.Например для Label есть Transparent.

алгоритм фон Неймана - C++
блин... помогите пожалуйста... надо упорядочить массив по неубыванию с помощью алгоритма сортировки слияниями (). Ваще даже не...

Залить картинкой фон консоли - C++
Здравствуйте.Подскажите пожалуйста если ли в с++ функции,при помощи которых можно залить в консоль музыку,залить на фон консоли...

цвет курсор и экран, фон - C++
Как можно узнать цвет курсор и экран, фон

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2300 / 1670 / 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, то закрашиваем фон, например, серым цветом.
Даемоник
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 ==========
CyBOSSeR
Эксперт C++
2300 / 1670 / 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.
Даемоник
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;
    }
}
Rififi
2359 / 1054 / 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++
как в с++ поставить задний фон (например картинку)??

Как изменить фон EditBox-а и заставить его переводить строки ? - C++
Столкнулся с проблемой: 1). В режиме Только чтение EditBox окрашивается в серый цвет, что не есть хорошо в моем случае. Все попытки...

Архитектура Фон Неймана: Как процессор различает команды и данные? - C++
Недавно читал статью про архитектуру вот наткнулся на такую строчку &quot;В памяти компьютера как данные так и команды хранятся одинаково виде...

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


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

Или воспользуйтесь поиском по форуму:
Даемоник
42 / 42 / 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