Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];

Вниз

Создание контролов   Найти похожие ветки 

 
Tosov   (2002-02-08 23:36) [0]

Как создавать стандартные элементы управления я знаю. А как создавать остальные (такие как в Дельфи на закладке Additional,Win32. Например, SpeedButton (плоский),ProgressBar,TrackBar и т.д.)? (что-то я не нашел таких классов)

Как создать Panel,GroupBox или что-нибудь похожее?


 
Digitman   (2002-02-09 11:30) [1]

>>"..не нашел таких классов"
а где искал-то ? и как искал ?

К примеру, то же компонент SpeedButton реализован в классе TSpeedButton, Panel - TPanel и т.д и т.п.

И ты хочешь сказать, что в твоем хэлпе нет ничего о классах TSpeedButton и TPanel ?


 
Tosov   (2002-02-09 11:52) [2]

I"m sorry..
я не стал писать что надо на WinAPI т.к. форум то "Используя WinAPI". Думал догадаетесь :)

P.S. Кстати исходников VCL у меня нет
CreateWindow(..,"BUTTON",..)- создает кнопку
А где взять список остальных классов контролов (может я не так выражаюсь?), которых нет в описании CreateWindow


 
Raptor   (2002-02-09 13:24) [3]

Используй CreateWindowEx. В хелпе (или MSDN) эта функция подробно описана, приведены классы и ссылки на описание различных стилей этих классов. В частности, если тебе нужен GroupBox, то это класс BUTTON со стилем BS_GROUPBOX.
Если нужен нестандартный вид, например кнопки, то назначаешь ей стиль BS_OWNERDRAW и в обработчике сообщений для этой кнопки перехватываешь WM_DRAWITEM, а там уже рисуешь, чего душе угодно. :-))
Вот пример создания такой кнопки:

CreateWindowEx(0, "BUTTON", "My Button", BS_OWNERDRAW or WS_CHILD or WS_VISIBLE or WS_TABSTOP , 220, 120, 120, 40, Wnd, 100, hInstance, NIL);

Если чего не ясно - спрашивай.


 
Tosov   (2002-02-09 23:23) [4]

Осталось еще несколько вопросов:
Что есть SpeedButton ?
Как создать например, trackbar ( и не только его)?
CreateWindowEx(а что дальше то?)
Что надо написать вместо "BUTTON","EDIT" чтобы получить Track Bar, Page Control (если такое есть) или TreeView? Если можно с примером.

Raptor
В хелпе (или MSDN) эта функция подробно описана, приведены классы и ссылки на описание различных стилей этих классов
Знаю, читал. Но не нашел там нужных мне классов... уверен,что плохо искал и они где-то там есть. Может подскажешь где?


 
Raptor   (2002-02-10 00:51) [5]

Что есть SpeedButton ?
TSpeedButton - это, компонент в VCL. В таком виде его нет в стандартных контролах винды. Это только делфийский контрол. Если тебе нужны нестандартные контролы, тебе придется создать их самому, так как ты, например, создаешь простое окно на WinAPI.

Такие контролы как Track Bar, Page Control, TreeView, ListView Это все так называемые Common Controls
Page Control - класс SysTabControl32
TreeView - класс SysTreeView32
ListView - класс SysListView32
TrackBar - класс TRACKBAR_CLASS
Все эти классы есть в библиотеке Common Controls винды ( comctl32.dll).
Для их использования в своем приложении надо сначала выполнить их инициализацию. Для этого используется процедура InitCommonControls из делфийского модуля CommCtrl. Или можно описать самому
procedure InitCommonControls; external "comctl32.dll" name "InitCommonControls";
Далее, например, для ListView:

CreateWindowEx(WS_EX_CLIENTEDGE, "SysListView32", NIL, WS_CHILD Or WS_VISIBLE Or WS_VSCROLL Or WS_BORDER Or WS_CLIPSIBLINGS Or LVS_LIST , 0, 0, 300, 200, Wnd, 200, hInstance, NIL);


Знаю, читал. Но не нашел там нужных мне классов... уверен,что плохо искал и они где-то там есть. Может подскажешь где?
Если у тебя есть MSDN от MSVS (а она должна быть у каждого, кто всерьез занимается WinAPI), то много чего можно найти там, простым поиском. Или заходи на www.msdn.microsof.com и там ищи. Тем более, что там всегда самая свежая информация, которой в статической MSDN от MSVS может и не быть.
Также класы стандартных контролов можно узнать с помощью всевозможныз Spy-прог, которых есть великое множество.


 
Tosov   (2002-02-10 17:17) [6]

//Что-то странное с форумом творится - восстановлю свой пост
Raptor
Спасибо.

Тогда можешь посоветовать, как сделать нечто похожее на плоский SpeedButton.
Мне нужен эффект кнопок как в диалоге отрытия/сохрания файлов в Office2000/Delphi6 и др. программах.(там кнопки слева " мой компьютер","мои документы", и т.д.)но не сам диалог :) При наведении мыши контрол становится не плоским.(Текст с иконкой на кнопке одновременно для меня пока тоже проблема-или текст или иконку (BS_ICON) это пожалуйста, а вместе как?)

Я делал в VCL-ной версии программы такое с помощью плоских прозрачных SpeedButton"ов.

И еще вопрос (что-то их уже много) как установить цвет фона у контрола ? (я fillrect, но по моему это не нормально)

ЗЫ. MSDN у меня за июль 2001 и там я этих классов не нашел. Поищу еще по классам которые ты мне дал, может найду ссылки на другие)


 
Raptor   (2002-02-10 23:53) [7]

//Что-то странное с форумом творится - восстановлю свой пост
Да, я заметил. Наверное у администратора сегодня плохое настроение. ;-))

Тогда можешь посоветовать, как сделать нечто похожее на плоский SpeedButton.
Мне нужен эффект кнопок как в диалоге отрытия/сохрания файлов в Office2000/Delphi6 и др. программах.(там кнопки слева " мой компьютер","мои документы", и т.д.)но не сам диалог :) При наведении мыши контрол становится не плоским.(Текст с иконкой на кнопке одновременно для меня пока тоже проблема-или текст или иконку (BS_ICON) это пожалуйста, а вместе как?)

Тут лучше всего юзать специально предназначеный для этого стандартный класс. Его имя ToolbarWindow32 или TOOLBARCLASSNAME. Я сам с ним не работал, так что ничего конкретного о нем сказать не могу. Но думаю, что это не проблема. Поищи информацию о нем и описание его сообщений в MSDN.

И еще вопрос (что-то их уже много) как установить цвет фона у контрола ? (я fillrect, но по моему это не нормально)
Какого именно контрола? Если ты его полностью сам рисуешь, то почему не нормально? Винда дает тебе только регион на DC где надо рисовать. Ну ты и рисуешь, то что тебе надо. Надо, что бы был зеленый фон - рисуешь зеленый, надо красный - рисуешь красный. Не вижу в этом ничего ненормального.


 
Tosov   (2002-02-11 00:23) [8]

>Какого именно контрола
Панели
CreateWindowEx(WS_EX_CLIENTEDGE,"BUTTON","",WS_CHILD or BS_GROUPBOX or WS_VISIBLE,...);
Там проблемы с перерисовкой .. а как установить цвет фона не знаю но думаю, что можно. Может надо какой нибудь sendmessage послать или в MSDN в SetWindowLong есть упоминание о WNDCLASSEX, который содержит
HCURSOR hCursor;
HBRUSH hbrBackground;
но как это использовать?

А на счет ToolBar попробую..


 
Raptor   (2002-02-12 00:44) [9]

Не знаю я почему у тебя перерисовка глючит. У меня не глючит. ;-))
Возможно, ты установил для главного окна стиль WS_CLIPCHILDREN.
Вот, лови небольшой примерчик некого подобия плоской кнопки. Правда написан он кривовато, можна лучше. Но писался он на скорую руку, а потому некоторую кривоватость ему можно простить. ;-))
Для тебя, я думаю, главное идея, а реализацию ты уж самостоятельно подправишь.

program FlatBtnDemo;
uses
Windows, Messages, Classes;

var
wc : TWndClassEx;
Wnd : HWND;
Msg : TMsg;
InControl:Boolean;
ButWnd,tmpWnd:HWND;

function WindowProc(wnd : HWND; Msg : Integer; wParam : WParam; lParam : LParam): Longint; stdcall;
var
DrawStruct:PDRAWITEMSTRUCT;
ButDC:HDC;
tmpRect,rr:TRect;
pnt:TPoint;
Begin
Result := 0;
case msg of
wm_destroy:Begin
postquitmessage(0);
Result:=0;
End;
WM_NCHITTEST:Begin
Result := DefWindowProc(wnd, msg, wparam, lparam);
End;
WM_SETCURSOR:Begin
GetCursorPos(pnt);
GetWindowRect(ButWnd,tmpRect);
If PtInRect(tmpRect,pnt)<>InControl Then Begin
InControl:=Not InControl;
RedrawWindow(ButWnd,0,0,RDW_INVALIDATE);
End;
Result := DefWindowProc(wnd, msg, wparam, lparam);
End;
WM_DRAWITEM:Case wParam Of
100:Begin
DrawStruct:=PDRAWITEMSTRUCT(lParam);
ButDC:=DrawStruct.hDC;
FillRect(ButDC,DrawStruct.rcItem,COLOR_BTNFACE+1);

//Draw Special Button States
//Default Button State
If ((DrawStruct.itemState and ODS_DEFAULT)<>0) or ((DrawStruct.ItemAction and ODA_DRAWENTIRE)<>0) Then Begin
If InControl Then DrawEdge(ButDC,DrawStruct.rcItem,BDR_RAISEDOUTER or BDR_RAISEDINNER,BF_RECT );
DrawText(ButDC,"Flat Button",11,DrawStruct.rcItem,DT_SINGLELINE or DT_CENTER or DT_VCENTER);
End;

//Focused Button State
If (DrawStruct.itemState and ODS_FOCUS)<>0 Then Begin
If InControl Then DrawEdge(ButDC,DrawStruct.rcItem,BDR_RAISEDOUTER or BDR_RAISEDINNER,BF_RECT );
DrawText(ButDC,"Flat Button",11,DrawStruct.rcItem,DT_SINGLELINE or DT_CENTER or DT_VCENTER);
End;

//Down Button State
If (DrawStruct.itemState and ODS_SELECTED)<>0 Then Begin
DrawEdge(ButDC,DrawStruct.rcItem,BDR_SUNKENOUTER or BDR_SUNKENINNER,BF_RECT );
rr:=DrawStruct.rcItem;
OffsetRect(rr,1,1);
DrawText(ButDC,"Flat Button",11,rr,DT_SINGLELINE or DT_CENTER or DT_VCENTER);
End;
Result:=Integer(True);
End;

End;
WM_COMMAND:Begin
case LoWord(wParam) of
100:begin
MessageBox(Wnd,"Flat Button Click","Flat Button Message",MB_OK or MB_ICONINFORMATION);
end;
end;
End;
else Result := DefWindowProc(wnd, msg, wparam, lparam);
end;//Case MSG
End;

begin
wc.cbSize:=sizeof(wc);
wc.style:=CS_HREDRAW or CS_VREDRAW;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0, IDI_APPLICATION);
wc.hCursor:=LoadCursor(0, IDC_ARROW);
wc.hbrBackground:=COLOR_BTNFACE + 1;
wc.lpszMenuName:=nil;
wc.lpszClassName:="Flat Button Example";
RegisterClassEx(wc);
Wnd := CreateWindowEx(WS_EX_CONTROLPARENT, "Flat Button Example", "Flat Button Demo",
WS_OVERLAPPEDWINDOW or WS_SYSMENU,200, 200, 300, 300, 0, 0,Hinstance, nil);
InControl:=False;
ButWnd:=CreateWindowEx(0, "BUTTON", "Flat Button", BS_OWNERDRAW or WS_CHILD or WS_VISIBLE or WS_TABSTOP , 10, 10, 100, 100, Wnd, 100, hInstance, NIL);
tmpWnd:=CreateWindowEx(0, "BUTTON", "Group Box",BS_GroupBox or WS_CHILD or WS_VISIBLE or WS_TABSTOP , 130, 10, 150, 100, Wnd, 200, hInstance, NIL);
CreateWindowEx(0, "BUTTON", "Button2", BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE or WS_TABSTOP , 10, 20, 70, 50, tmpWnd, 300, hInstance, NIL);

ShowWindow(Wnd, CmdShow);

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


ЗЫ. Да, в этом примере присуттствует GroupBox и отрисовка на нем, по крайней мере у меня, не глючит.


 
Evgeny   (2002-02-12 07:48) [10]

Пример действительно как и обещано сплошь кривой. Но не это главное, главное забыт флаг (для плоской кнопки) BS_FLAT. Хотя кнопка при этом получается весьма уродливой. Лучше все действительно отрисовывать руками через WM_DRAWITEM. А еще лучше для этого использовать ToolBar, и кнопки реально всплывающие получаются и образы можно динамически менять как в Эсплорере. Если сам не разберешься пиши, нарисую пример.


 
Raptor   (2002-02-12 22:44) [11]

2 Evgeny
Пример действительно как и обещано сплошь кривой
Ну не такой уж и сплошь... ;-))
Единственное, что, имхо, здесь действительно кривовато написано, это определение входа и выхода мыши из клиентской области кнопки. Ведь в винде нет (а жаль) специальных сообщений (что то типа WM_MOUSEENTER и WM_MOUSELEAVE) предназначеных для этих целей. Подобный этому механизм используется в VCL, только он там более совершенен. Я же его написал на скорую руку.
Но не это главное, главное забыт флаг (для плоской кнопки) BS_FLAT.
Это для чего же он здесь нужен? И почему это главное? ;-))
Я же отрисовываю кнопку полностью "вручную" (используется стиль BS_OWNERDRAW). А в MSDN ясно сказано:
When you use the BS_OWNERDRAW style for a button, you assume all responsibility for drawing the button. You cannot use any other button styles with the BS_OWNERDRAW style.
Так причем здесь тогда BS_FLAT?
Другое дело, что сама отрисовка никудышняя, но это только пример оной.


 
Evgeny   (2002-02-13 06:59) [12]

Можно сделать примерно так:

{ В ресурсном файле: иконка и 2 образа для кнопки }
program TBar;

uses
Windows, Messages, ShellAPI, CommCtrl;

const
szAppName = "Flat Button";

var
Wnd : HWND;
Msg : TMsg;
WndClass : TWndClassEX;
hTBar : HWND;
hImList : HWND;
btnTBar : TTBButton;


{$R TBar.res}

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

procedure CreateToolBarButton(Wnd : HWND);
var
tbab : TBADDBITMAP;
begin
hTBar := CreateWindowEx(0, "ToolBarWindow32", NIL,
CCS_NOPARENTALIGN or CCS_NORESIZE or
TBSTYLE_TOOLTIPS or WS_CHILD or WS_VISIBLE or
TBSTYLE_FLAT or CCS_NODIVIDER,
130, 100, 28, 28,
Wnd, 3000, hInstance, NIL);
SendMessage(hTBar, TB_BUTTONSTRUCTSIZE, SizeOf(TTBBUTTON), 0);
SendMessage(hTBar, TB_SETBITMAPSIZE, 0, MAKELONG(20, 20));
tbab.hInst := hInstance;
tbab.nID := 4020; // моно картинка
SendMessage(hTBar, TB_ADDBITMAP, 1, Integer(@tbab));
// цветная картинка
hImList := ImageList_LoadBitmap(hInstance, MAKEINTRESOURCE(4025), 20, 1, $C0C0C0);
SendMessage(hTBar, TB_SETHOTIMAGELIST, 0, hImList);

with btnTBar do
begin
iBitmap := 0;
idCommand := 3010;
fsState := TBSTATE_ENABLED;
fsStyle := TBSTYLE_BUTTON;
dwData := 0;
iString := 0;
end;
SendMessage(hTBar, TB_ADDBUTTONS, 1, Integer(@btnTBar));
end;

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

function CallBackProc(Wnd: THandle; iMsg: Integer;
wParam, lParam: Longint): Integer; stdcall; export;
begin
CallBackProc := 0;
case iMsg of
WM_CREATE : CreateToolBarButton(Wnd);

WM_NOTIFY :
begin
if PToolTipText(lParam).hdr.code = TTN_NEEDTEXT then
case PToolTipText(lParam).hdr.idFrom of
3010 : PToolTipText(lParam).lpszText := "ToolBar Flat Button";
end;
end;

WM_COMMAND :
begin
case LOWORD(wParam) of
3010 : SendMessage(Wnd, WM_CLOSE, 0, 0);
end;
end;

WM_DESTROY :
begin
PostQuitMessage(0);
Exit;
end;
end;
CallBackProc := DefWindowProc(Wnd, iMsg, wParam, lParam);
end;

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

begin
WndClass.cbSize := SizeOf(WndClass);
WndClass.style := CS_HREDRAW or CS_VREDRAW;
WndClass.lpfnWndProc := @CallBackProc;
WndClass.cbClsExtra := 0;
WndClass.cbWndExtra := 0;
WndClass.hInstance := hInstance;
WndClass.hIcon := LoadIcon(hInstance, MAKEINTRESOURCE(4010));
WndClass.hCursor := LoadCursor(0, IDC_ARROW);
WndClass.hbrBackGround := GetStockObject(LTGRAY_BRUSH);
WndClass.lpszMenuName := "";
WndClass.lpszClassName := szAppName;
WndClass.hIconSm := LoadImage(hInstance, MAKEINTRESOURCE(4010),
IMAGE_ICON, 16, 16, 0);

if RegisterClassEx(WndClass) = 0 then
Exit;

Wnd := CreateWindowEx(0, szAppName, szAppName,
WS_OVERLAPPEDWINDOW,
0, 0, 300, 200,
0, 0,
hInstance, NIL);

InitCommonControls;
ShowWindow(Wnd, CmdShow);

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.004 c
1-46316
Deus
2002-04-03 16:18
2002.04.15
А как бы принудительно показать hint?


3-46295
IronHawk
2002-03-21 10:58
2002.04.15
Иммитация нажатия клавиш DBNavigator !


1-46355
michael_B
2002-04-03 19:40
2002.04.15
помогите начинающему TComboBox.Items


3-46265
XanderMan
2002-03-25 21:35
2002.04.15
Извлечение дня, месяца и года из поля типа Date в InterBase


1-46384
VBill
2002-04-01 13:11
2002.04.15
Как определить какая прога





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский