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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод BMP на фон кнопок, edit, Прозрачный фон или bmp static-ов и edit 
:(
    Опции темы
MAXIQ
Дата 28.2.2008, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 30.12.2006

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



Здравствуйте, вопрос в следующем: как вывести bmp в окно кнопки ? Я что-то запутался совсем.
Не пробовал только Image List  создавать.

Вот фрагмент кода:
Код

static HWND hWndButton;
HDC hDC,hBitmapDC;
HBITMAP hOldBitmap;
RECT Rect;
POINTSTRUCT ps;

.  .  .

hDC=BeginPaint(hWndButton,&ps);
hBitmapDC=CreateCompatibleDC(hDC);
hOldBitmap=SelectObject(hBitmapDC,hBitmap);
GetClientRect(hWndButton,&Rect);
BitBlt(hDC,Rect.left,Rect.top,Rect.right,Rect.bottom,hBitmapDC,0,0,SRCCOPY);
EndPaint(hWndButton,&ps);
SelectObject (hBitmapDC,hOldBitmap);
DeleteDC(hBitmapDC);

.  .  .

DeleteObject(hBitmap);


в результате имеем просто серый прямоугльник кнопки без рисунка(( это если указать в BS_ что кнопка содержит рисунок. А если не указывать то отображается текст, указаный в CreateWindow(). Но я то хотел рисунок на фоне и на этом фоне надпись!!

И еще 3 вопросика:
Если кто знает, то как вывести текст в элементе static с прозрачным фоном?
Как прогрузить в edit на фон свой рисунок или сделать его прозрачным?
И где бы посмотреть реализацию этих элементов, особенно edit-a а то отношение к нему как "ченому ящику", как пишут в литературе, не сильно устраивает.... 

Знаю что вопросов много назадавал, но это наверно самые основные для желающих делать свой оригинальный интерфейс.




PM MAIL   Вверх
BorisVorontsov
Дата 28.2.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 4
Всего: 10



1. BS_OWNERDRAW

2. WM_CTLCOLORSTATIC


--------------------
[code=cpp]
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;
[/code]
PM MAIL ICQ GTalk   Вверх
MAXIQ
Дата 29.2.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 30.12.2006

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



Я вообще-то пробовал с BS_OWNERDRAW рисовать но получается хрень какая-то. В верху места отеденного под кнопку отображается полоска черного цвета и все. А битмэпа нету((
    На всякий случай привожу пример кода полностью. Дабы не забивать голову областями видимости и жизни пременных все объявлено глобально. Edit  пока не трогаем))
Код

//---------------------------------------------------------------------------

#include <windows.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

HINSTANCE hInst;
HWND hWnd,hWndButton,hWndEdit;
MSG msg;
UINT ID_button=1,ID_edit=2;
char ClassName[]="Window";
char AppTitle[]="Application Win32";
PAINTSTRUCT ps;
RECT Rect;
BITMAP Bitmap;
HANDLE hBitmap,hButtonBitmap;
HDC hDC,hBitmapDC;
HBITMAP hOldBitmap;

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
hInst=hInstance;

if((hWnd=FindWindow(ClassName, NULL))!=NULL)
    {
        if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);
        SetForegroundWindow(hWnd);
        return FALSE;
    }
        hBitmap=LoadImage(NULL,"Fon.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    memset(&wc, 0, sizeof(wc));
    wc.lpszClassName=ClassName;
    wc.lpfnWndProc=(WNDPROC)WndProc;
    wc.style=CS_HREDRAW|CS_VREDRAW;
    wc.hInstance=hInstance;
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
       // wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hbrBackground=(HBRUSH)CreatePatternBrush(hBitmap);
    wc.lpszMenuName=NULL;
    wc.cbClsExtra=0;
    wc.cbWndExtra=0;

    RegisterClass(&wc);

    hWnd=CreateWindow(
        ClassName,
        AppTitle,
        WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,
        CW_USEDEFAULT,            // X
        CW_USEDEFAULT,            // Y
        CW_USEDEFAULT,            // Widtch
        CW_USEDEFAULT,            // Height
        NULL,                // Hendle Parent
        NULL,                // Menu
        hInst,                // Hendle axemplara program
        NULL);                // Other information
    if(!hWnd) 
    {
        MessageBox(NULL,"Create: error",AppTitle,MB_OK|MB_ICONSTOP);
        return FALSE;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
        switch(msg)
    {
                case WM_CREATE:
                        {
                        hWndButton=CreateWindow("button","Exit",
                WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|BS_PUSHBUTTON|BS_BITMAP|BS_OWNERDRAW,
                10,10,60,20,hWnd,(HMENU)ID_button,hInst,NULL);
                        hButtonBitmap=LoadImage(NULL,"Button1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
                        //-------------------------------------------
                        hWndEdit=CreateWindow("edit","string",
                WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER,
                10,50,60,20,hWnd,(HMENU)ID_button,hInst,NULL);
                        };break;
                case WM_PAINT:
                        {
                        hDC=BeginPaint(hWndButton,&ps);
                        hBitmapDC=CreateCompatibleDC(hDC);
                        hOldBitmap=SelectObject(hBitmapDC,hBitmap);
                        GetClientRect(hWndButton,&Rect);
                        BitBlt(hDC,Rect.left,Rect.top,Rect.right,Rect.bottom,hBitmapDC,0,0,SRCCOPY);
                        EndPaint(hWndButton,&ps);
                        SelectObject (hBitmapDC,hOldBitmap);
                        DeleteDC(hBitmapDC);
                        };break;
                case WM_DESTROY:
                {
                        DeleteObject(hBitmap);
            PostQuitMessage(0);
                }; break;
        default: return DefWindowProc(hWnd, msg, wParam, lParam);
        }
        return 0l;
}

PM MAIL   Вверх
cvid
Дата 29.2.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 29.10.2007

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



Не трогай Edit, он и есть черный ящик. Использую RichEdit - там и фон поменять можно и шрифт задать покрасивше. 
Вместо статика предлагаю рисовать на форме LOGFONT. 
А по поводу кнопки, попробуй грузить Image List. С битмапами я не пробовал, зато с иконками -  даю гарантию.
PM MAIL   Вверх
MAXIQ
Дата 1.3.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 30.12.2006

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



Загрузил короче)) листинг правильный был, только рисунок надо было поменять, чтоб отличался от фонового. А то он меня в иллюзию вводил.
Это я по поводу кнопки)), однако: текст который должен был быть выведен исчез, а если убрать BS_OWNERDRAW, то после клика вылазит просто серая кнопка без ничего. Ведет себя как и положено кнопке, нажимается и т.д. НО где ж рисунок и текст?? Мы ж рисовали на WM_PAINT... и кнопка должна перерисовываться.... Или что ж получается, окно создали.. а дальше надо все поведение прописывать жестоко самому??? И WM_PAINT, и WM_CREATE, и WM_RBUTTONDOWN??? И самому выводить текст при каждой перерисовке?? Поправьте если не прав...

Про ImageList тут без вариантов, конечно им надо пользоваться, особенно на кнопках, спасибо за дельный совет.
BMP просто для примера взят, как конкретный рисунок который надо грузить в элемент управления.

Еще хотел спросить как применить етот WM_CTLCOLORSTATIC? Люди давайте с примерами, если вам не в лом
Не то что бы тут очень ленивые читать собрались, однако чтивши Румянцева и еще Обучающую среду, качаных тут же на Vingrade я такого сообщения не встретил... Метайте ссылки хотя бы где вы ето брали)))

Нашел только  wm_CtlColor
Дает pодительскому окну или дочеpнему оpгану упpавления возможность изменить
цвета фона и текста, котоpыми наpисован дочеpний элемент.

Паpаметpы:

wParam: Является описателем контекста дисплея для дочеpнего окна.

lParamLo: Является описателем дочеpнего окна.

lParamHi: Является одной из констант ctlcolor_. Опpеделяет тип дочеpнего окна.


Пробовал к стати перехватить оконную процедуру edita, но не благодарное ето занятие.
Тогда уж лучше сразу писать свою и заменять все к еп.. матери. Знал бы как реализован edit, давно бы передрал по- своему.
Пошел короче предложения пробовать)))
PM MAIL   Вверх
MAXIQ
Дата 3.3.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 30.12.2006

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



Установка прозрачного фона выводимого текста: SetBkMode(hDC,TRANSPARENT); Потом можно выводить текст с помощью DrawText или  TextOut
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0769 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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