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


Автор: BLACK_KOT 11.9.2010, 12:51
Код

program BLACK_KOT;

uses Messages,Windows;

var
Form1,Memo1,Memo2,Button2,Button3,Button1,Edit1,CheckBox1,Panel1,RadioButton1,Memo3 : HWND;
BLACK_KOT_window: TWndClass;
Msg: TMsg;

//--------------------главный обработчик сообщений
function WndProc(hnd, wmsg, wparam, lparam: integer): integer; stdcall;
begin
Result:=0;
case wmsg of
  WM_CREATE:
  begin
  Memo1:=CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', ' ',  ES_MULTILINE or WS_HSCROLL or WS_VISIBLE or WS_CHILD,8, 8, 153,233, hnd, 0, HInstance, nil);
  Memo2:=CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', ' ',  ES_MULTILINE or WS_HSCROLL or WS_VSCROLL or WS_VISIBLE or WS_CHILD,168, 8, 153,233, hnd, 0, HInstance, nil);
  Button2:=CreateWindowEx(0, 'Button', 'фильтр',WS_VISIBLE or WS_CHILD,328, 216, 73,25, hnd, 0, HInstance, nil);
  Button3:=CreateWindowEx(0, 'Button', 'создать',WS_VISIBLE or WS_CHILD,408, 216, 65,25, hnd, 0, HInstance, nil);
  Button1:=CreateWindowEx(0, 'Button', 'открыть форму ',WS_VISIBLE or WS_CHILD,328, 184, 145,25, hnd, 0, HInstance, nil);
  Edit1:=CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', 'ПриВет Я андрей',WS_BORDER or ES_AUTOHSCROLL or WS_VISIBLE or WS_CHILD,336, 24, 121,21, hnd, 0, HInstance, nil);
  CheckBox1:=CreateWindowEx(0, 'Button', 'kgugtu',  BS_AUTOCHECKBOX or WS_VISIBLE or WS_CHILD,336, 48, 137,17, hnd, 0, HInstance, nil);
  Panel1:=CreateWindowEx(0, 'Static', 'Panel1', WS_DLGFRAME or WS_VISIBLE or WS_CHILD,336, 88, 105,33, hnd, 0, HInstance, nil);
  RadioButton1:=CreateWindowEx(0, 'Button', 'RadioButton1',  BS_AUTORADIOBUTTON or WS_VISIBLE or WS_CHILD,352, 136, 113,17, hnd, 0, HInstance, nil);
  Memo3:=CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', ' ',  ES_MULTILINE or WS_HSCROLL or WS_VSCROLL or WS_VISIBLE or WS_CHILD,8, 248, 465,209, hnd, 0, HInstance, nil);
  
  end;
  WM_DESTROY: PostQuitMessage(0);
  else Result:=DefWindowProc(hnd, wmsg, wparam, lparam);
  end;
end;

Procedure CreateMySelf;
begin
with BLACK_KOT_window do
  begin
  lpszClassName:='BLACK_KOT_window';
  lpfnWndProc:=@WndProc;
  hCursor:=LoadCursor(hInstance, IDC_ARROW);
  hbrBackground:=COLOR_3DSHADOW;
  end;
RegisterClass(BLACK_KOT_window);
Form1:=CreateWindowEx(WS_EX_CLIENTEDGE, 'BLACK_KOT_window','Form1', WS_OVERLAPPEDWINDOW or WS_VISIBLE,254, 189, 495,496, 0, 0, HInstance, nil);;
end;

begin
CreateMySelf;
while GetMessage(Msg, 0, 0, 0) do
  begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
  end;
end.

 
создаю форму. цвет самой формы я могу задать сначала hbrBackground:=COLOR_3DSHADOW; а вот как мне задать например цвет панели или мемо? какое сообщение посылать,с какими параметрами. лучше всего на примере. помогите!

Автор: Maks1509 12.9.2010, 15:56
Я предпочитаю узнавать хэндлы окошек через GetDlgItem, так проще, особенно когда идентификаторы этих элементов управления прописаны фиксированно.
Для мем (давай называть вещи своими именами, а не нахлобучки от VCL, это контрол EDIT и всё же ты на апи делаешь теперь) обрабатывай WM_CTLCOLOREDIT, где будешь возвращать в результате кисть, а типа панелька это STATIC - WM_CTLCOLORSTATIC соответственно.

Код

  WM_CTLCOLORSTATIC:
  begin
    case GetDlgCtrlId(lParam) of
      0: Result := GetStockObject(WHITE_BRUSH);
    end;
  end;


Тут у тебя в примере идентификаторы равны нулю, поэтому все статики с ним будут окрашены в белый цвет.

Автор: BLACK_KOT 12.9.2010, 18:02
Спасибо тебе большое, очень выручил! Я пишу конвертор, из исходника VCL  чтоб в WinApi переводить проги.  Файлы с гасширением .dfm содержат полное описание всех контролов и свойств самой формы. Перевести форму c VCL на WinApi бообще не проблема. Сложнее наложить на неё код из .pas файлов. Может кто-нибудь занимался этой темой, есть наработки? Может кого заинтересовало?

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