Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компилер не находит определения SetDCBrushColor, хотя wingdi.h подключен 
V
    Опции темы
Тутанхамец
Дата 26.1.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: нет
Всего: 6




Проблема в следующем. При упоминании некоторых констант ( DC_BRUSH, например) и функций из wingdi.h компилер говорит, что это undeclared identifier.

Работаю на: WinXP, VC++ 6.0.

gdi32.lib линкуется.

[code=cpp]
#include "windows.h"
#include "windowsx.h"
#include <commctrl.h>
#include "resource.h"
#include "time.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"
#include "winuser.h"
#include "wingdi.h"

..........
//если в Эдит "1", то красим его одним цветом, иначе - другим.

HBRUSH Test_OnCtlColor(HWND hwnd, HDC hdc, HWND hwndChild, int type){

int id=GetDlgCtrlID(hwndChild);
LPTSTR c;

if ((id>=ID_ED)&&(id<=(ID_ED+31))){
SetBkMode(hdc, TRANSPARENT);
GetWindowText(hwndChild,c,1);
if (c=="1") SetDCBrushColor(hdc, RGB(20,30,0)); else SetDCBrushColor(hdc, RGB(120,0,0));
}
return br_edit;
}

Кто подскажет?
PM MAIL   Вверх
Fixin
Дата 26.1.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Цитата(Тутанхамец @ 26.1.2006, 09:19 Найти цитируемый пост)

c=="1"

Так нельзя!
Это делается с помощью функции lstrcmp(buf, "1"); Если == 0, значит строки совпадают. И строка у тебя не имеет размера - только указатель. Прлще сделать по старинке:
Код

char buf[10];
GetWindowText(hwndChild, buf ,10);

Сделали буфер приема.

Цитата(Тутанхамец @ 26.1.2006, 09:19 Найти цитируемый пост)

#include "windows.h"
#include "windowsx.h"
#include <commctrl.h>
#include "resource.h"
#include "time.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"
#include "winuser.h"
#include "wingdi.h"

Все в угловых скобках! В кавычках только те заголовочники, которые лежат в папке с проектом, обычно они же и являются "самодельными".
И вообще:
Код

HBRUSH Test_OnCtlColor(HWND hwnd, HDC hdc, HWND hwndChild, int type)
{
    if (type == CTLCOLOR_EDIT)
    {
        int id=GetDlgCtrlID(hwndChild);
        char buf[10];

        if ((id>=ID_ED)&&(id<=(ID_ED+31)))
        {
            SetBkMode(hdc, TRANSPARENT);
            GetWindowText(hwndChild,buf,1);
            if (!lstrcmp(buf, "1")) SetDCBrushColor(hdc, RGB(20,30,0)); 
                else SetDCBrushColor(hdc, RGB(120,0,0));
        }
    }
    return br_edit;
}

Добавлено @ 09:51
Попробуй все это исправить, а потом расскажешь, помогло или нет.
PM MAIL ICQ   Вверх
Тутанхамец
Дата 26.1.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: нет
Всего: 6



Нла... облажался... про заголовочники не знал, а вот насчет == знал прекрасно, но не так-то просто забыть бейсик... smile

Спасибо за дебаггинг. smile

Процедура заработала, но проблема с SetDCBrushColor осталась! Компилятор просто не знает такой функции, хотя в wingdi.h она объявлена. В коде ниже я возвращаю разные кисти, но хотелось бы обойтись одной и только менять цвет.

Код

HBRUSH Test_OnCtlColor(HWND hwnd, HDC hdc, HWND hwndChild, int type){

if (type==CTLCOLOR_EDIT) {
    int id=GetDlgCtrlID(hwndChild);
    if ((id>=ID_ED)&&(id<=(ID_ED+31))){
    
    char c[10];
    SetBkMode(hdc, TRANSPARENT);
                GetWindowText(hwndChild,c,3);
    if (!lstrcmp(c,"1"))
        return br1;
                                       //    SetDCBrushColor(hdc, RGB(20,30,0)); 
    else 
                            //SetDCBrushColor(hdc, RGB(120,0,0));
        return br2;
    }

}
return br_edit;


}


Добавлено @ 10:13
А вот это вот из wingdi.h...

Код

#if (_WIN32_WINNT >= 0x0500)
WINGDIAPI COLORREF WINAPI SetDCBrushColor(HDC, COLORREF);
WINGDIAPI COLORREF WINAPI SetDCPenColor(HDC, COLORREF);
#endif


Это ведь значит в WinXP оно должно объявиться, так?
PM MAIL   Вверх
Fixin
Дата 26.1.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



ага. в самом начале проги пишешь (до заголовочников!):
Код

#define WINVER 0x501

В новых студиях это само собой разумеется.
Добавлено @ 10:22
Цитата(Тутанхамец @ 26.1.2006, 10:11 Найти цитируемый пост)

не так-то просто забыть бейсик

А чего на VB.NET не пошел?
PM MAIL ICQ   Вверх
Тутанхамец
Дата 26.1.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: нет
Всего: 6



Заработало вот в таком вот виде:

Код

//   #define WINVER 0x501
#define _WIN32_WINNT 0x501


thanks! smile
Добавлено @ 10:30
Чего на VB.NET не пошел... Черт его знает. Как говорил Каннибал Лектер (или как его там звали): "всегда интересно пробовать новое". )
PM MAIL   Вверх
Fixin
Дата 26.1.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Ганни он был кажись smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.