Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Прозрачность WinAPI checkbox 'a


Автор: djman2006 29.6.2009, 23:15
Здравствуйте!

Как сделать checkbox прозрачным (разумеется не сам чекбокс а область где текст к нему) ?

Например:
Код

program Project1;


uses
  windows,
  messages,
  SysUtils;

const
  id_Checkbox = 101;
  id_Image = 103;
var
  window:TWndClassEx;
  Mwindow: HWND;
  Mmsg: MSG;

// XP Style
Procedure InitCommonControls; External 'comctl32.dll' Name 'InitCommonControls';

// Процедура обработки сообщений
function WindowProc (wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
var
  hCheckBox : HWND;
  hImageStatic : HWND;
  hImage : HBITMAP;
begin
    case msg of
        WM_Destroy: begin
            PostQuitMessage (0);
            Result := 0;
            Exit;
        end;
    wm_Create:
            begin
        hImageStatic:=CreateWindowEx(0,
                    'Static',
                    nil,
                    WS_CHILD or WS_VISIBLE {or WS_BORDER} or SS_BITMAP or SS_CENTERIMAGE,
                    0, 0,
                    434, 162,
                    wnd, id_Image, hInstance, nil);
        hImage := LoadImage(hInstance,'C:\Windows\winnt.bmp', IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE or LR_LOADMAP3DCOLORS);
                SendMessage(hImageStatic, STM_SETIMAGE, IMAGE_BITMAP, hImage);
        
        // checkbox
                hCheckBox:=CreateWindowEx (0, // extended styles
                    'BUTTON', // predefined class
                    PChar('click me'), // caption
                    ws_Child or ws_Visible or BS_CHECKBOX, // styles
                    14, 128, // position
                    200, 20, // size
                    wnd, // parent
                    id_Checkbox, hInstance, nil);
            end;
    wm_Command:
    begin
     // if it comes from the checkbox
     if ((LoWord (wparam) = id_Checkbox) AND (HiWord (wparam) = bn_Clicked)) then
       if IsDlgButtonChecked(wnd, id_Checkbox) = BST_CHECKED then
         CheckDlgButton(wnd, id_Checkbox, BST_UNCHECKED)
       else CheckDlgButton(wnd, id_Checkbox, BST_CHECKED);
    end;
        else
        Result := DefWindowProc(wnd,msg,wparam,lparam);
    end;
end;

begin

  InitCommonControls;
  // Ристрация класса окна
    window.cbSize := sizeof (window);
    window.style := CS_HREDRAW or CS_VREDRAW;
    window.lpfnWndProc := @WindowProc;
    window.cbClsExtra := 0;
    window.cbWndExtra := 0;
    window.hInstance := HInstance;
    window.hIcon := LoadIcon (0,IDI_APPLICATION);
    window.hCursor := LoadCursor (0,IDC_ARROW);
    window.hbrBackground:=COLOR_WINDOW;
    window.lpszMenuName := nil;
    window.lpszClassName := 'Main_Window';
    RegisterClassEx (window);
    // Создание окна на основе созданного класса
    Mwindow := CreateWindowEx(0,'Main_Window',PChar('WinAPI window'), WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU,100,100,440,188,0,0,Hinstance,nil);
    // Показать созданное окно
    SHOWWINDOW (Mwindow,SW_Show);
    // Цикл обработки сообщений
    while GetMessage (Mmsg,0,0,0) do
    begin
        TranslateMessage (Mmsg);
        DispatchMessage (Mmsg);
    end;
end.



Выдает:
user posted image

Автор: V0LT 30.6.2009, 02:08
Ваша проблема решена ... и я иду спать  smile 
Добавил лишь обработку WM_CTLCOLORSTATIC  
а ещё добавлю от себя - это можно сказать мой самый любимый метод создания небольших приложений на Delphi  smile 
Код
program Project1;


uses
  windows,
  messages,
  SysUtils;

const
  id_Checkbox = 101;
  id_Image = 103;
var
  window:TWndClassEx;
  Mwindow: HWND;
  Mmsg: MSG;

// XP Style
Procedure InitCommonControls; External 'comctl32.dll' Name 'InitCommonControls';

// Процедура обработки сообщений
function WindowProc (wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
var
  hCheckBox : HWND;
  hImageStatic : HWND;
  hImage : HBITMAP;
begin
    case msg of
        WM_Destroy: begin
            PostQuitMessage (0);
            Result := 0;
            Exit;
        end;
    wm_Create:
            begin
        hImageStatic:=CreateWindowEx(0,
                    'Static',
                    nil,
                    WS_CHILD or WS_VISIBLE {or WS_BORDER} or SS_BITMAP or SS_CENTERIMAGE,
                    0, 0,
                    434, 162,
                    wnd, id_Image, hInstance, nil);
        hImage := LoadImage(hInstance,'C:\Windows\winnt.bmp', IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE or LR_LOADMAP3DCOLORS);
                SendMessage(hImageStatic, STM_SETIMAGE, IMAGE_BITMAP, hImage);
        
        // checkbox
                hCheckBox:=CreateWindowEx (0, // extended styles
                    'BUTTON', // predefined class
                    PChar('click me'), // caption
                    ws_Child or ws_Visible or BS_CHECKBOX, // styles
                    14, 128, // position
                    200, 20, // size
                    wnd, // parent
                    id_Checkbox, hInstance, nil);
            end;
    WM_CTLCOLORSTATIC:
    begin
      SetTextColor(WParam, $00ff00);  // !!! Для наглядности !!!
      SetBkMode(WParam, TRANSPARENT);
      Result := GetStockObject(NULL_BRUSH);
    end;
    wm_Command:
    begin
     // if it comes from the checkbox
     if ((LoWord (wparam) = id_Checkbox) AND (HiWord (wparam) = bn_Clicked)) then
       if IsDlgButtonChecked(wnd, id_Checkbox) = BST_CHECKED then
         CheckDlgButton(wnd, id_Checkbox, BST_UNCHECKED)
       else CheckDlgButton(wnd, id_Checkbox, BST_CHECKED);
    end;
        else
        Result := DefWindowProc(wnd,msg,wparam,lparam);
    end;
end;

begin

  InitCommonControls;
  // Ристрация класса окна
    window.cbSize := sizeof (window);
    window.style := CS_HREDRAW or CS_VREDRAW;
    window.lpfnWndProc := @WindowProc;
    window.cbClsExtra := 0;
    window.cbWndExtra := 0;
    window.hInstance := HInstance;
    window.hIcon := LoadIcon (0,IDI_APPLICATION);
    window.hCursor := LoadCursor (0,IDC_ARROW);
    window.hbrBackground:=COLOR_WINDOW;
    window.lpszMenuName := nil;
    window.lpszClassName := 'Main_Window';
    RegisterClassEx (window);
    // Создание окна на основе созданного класса
    Mwindow := CreateWindowEx(0,'Main_Window',PChar('WinAPI window'), WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU,100,100,440,188,0,0,Hinstance,nil);
    // Показать созданное окно
    SHOWWINDOW (Mwindow,SW_Show);
    // Цикл обработки сообщений
    while GetMessage (Mmsg,0,0,0) do
    begin
        TranslateMessage (Mmsg);
        DispatchMessage (Mmsg);
    end;
end.


user posted image

Автор: djman2006 30.6.2009, 05:58
2 V0LT
Спасибо большое  smile 
Цитата(V0LT)
Добавил лишь обработку WM_CTLCOLORSTATIC  

Буду теперь знать smile 
Цитата(V0LT)
а ещё добавлю от себя - это можно сказать мой самый любимый метод создания небольших приложений на Delphi   

Полностью поддерживаю!  smile 
Еще раз спасибо smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)