Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

Все-таки как включить поддержку Visual Styles ????   Найти похожие ветки 

 
Comp ©   (2004-09-26 18:02) [0]

Народ, нужен пример. Пишу чисто на API. С++ пока не изучал, довольствуюсь Delphi. Как правильно настроить это дело?
Я не думаю, что обязательно надо все самому рисовать - можно и Windows заставить это делать. Ведь на то и API нужны...


 
Dimaxx   (2004-09-26 22:16) [1]

Есть такая штука как манифест.


 
Comp ©   (2004-09-27 00:02) [2]

Dimaxx , Ну? Я слышал.
Но тока он не работает с программами, которые написаны на API.
Я слышал, что его как-то в ресурсный файл вшивают. А как потом использовать?


 
Yanis ©   (2004-09-27 00:09) [3]

Не нужно ничего "вшивать". Если у тебя 7 delphi то просто в uses напиши XPMan или напиши:

{$R WindowsXP.res}


>А как потом использовать?
Он сам работает.


 
Comp ©   (2004-09-27 00:19) [4]

Yanis, да, у мня Д7 и это все работает.
Но тока когда программируешь через VCL.
На АПИ ЭТО ВСЕ НЕ ПАШЕТ!
Иначе я бы вопрос не задавал.
А не работает просто - элементы не создаются, ничего не видно, не слышно... Тока одно окно висит и все.


 
Gero ©   (2004-09-27 00:20) [5]


> А не работает просто - элементы не создаются, ничего не
> видно, не слышно...

У тебя ошибка в программе.


 
Cobalt ©   (2004-09-27 00:21) [6]

Гы :)
А окна точно создаются? Посмотри WinSight"ом.


 
Comp ©   (2004-09-27 00:27) [7]

Gero, замечание мало-мальски по существу...

Люди, исходный код гляньте, пожалуйста:
(Правда он не мой, где взял не помню, но создание окна через АПИ происходит...)



program window;

uses
 windows, messages;
{$R *.RES}

//îáúÿâëåíèÿ ïåðåìåííûõ
var
   wcl: TWNDCLASS;
   msg: TMSG;
   hMainWnd, hButton1, hButton2, hEdit1, hEdit2, hStatic: HWND;
   szWinName: PCHAR;
   szBuff: array[0 .. 18] of char;

//îêîííàÿ ôóíêöèÿ
procedure WindowFunc(hMainWnd: HWND; iMsg: integer; wParam: WPARAM; lParam: LPARAM); stdcall;
Begin
case iMsg of
   WM_DESTROY: PostQuitMessage(0);

   WM_COMMAND:
   begin
       if (HWND(lParam) = hButton2) and (wParam = HIWORD(BN_CLICKED)) then PostQuitMessage(0);

       if (HWND(lParam) = hButton1) and (wParam = HIWORD(BN_CLICKED)) then
           begin
               GetWindowText(hEdit1, szBuff, 18);
               SetWindowText(hEdit2, szBuff);
           end;
   end

   else
   DefWindowProc(hMainWnd, iMsg, wParam, lParam);
   end;
End;

begin
//èìÿ îêîííîãî êëàññà
szWinName := "MyClass";
//çàïîëíÿåì ñòðóêòóðó òèïà TWNDCLASS
wcl.hInstance:= hInstance;
wcl.lpszClassName:= szWinName;
wcl.lpfnWndProc:= @WindowFunc;
wcl.style:= 0;
wcl.hIcon:= LoadIcon(0, IDI_ASTERISK);
wcl.hCursor:= LoadCursor(0,IDC_ARROW);
wcl.lpszMenuName:= nil;
wcl.cbClsExtra:= 0;
wcl.cbWndExtra:= 0;
wcl.hbrBackground:= COLOR_WINDOW;
// ðåãåñòðèðóåì êëàññ îêíà
RegisterClass(wcl);

//ñîçäàåì ãëàâíîå îêíî è ýëåìåíòû óïðàâëåíèÿ
hMainWnd:= CreateWindow(szWinName, "Ïðîñòîå îêíî íà API.", (WS_OVERLAPPEDWINDOW xor WS_THICKFRAME xor WS_MAXIMIZEBOX),
                       CW_USEDEFAULT, CW_USEDEFAULT,
                       300, 170, 0, 0, hInstance, nil);

hButton1:= CreateWindow("button", "Copy", WS_CHILD or WS_VISIBLE, 200, 10, 70, 25, hMainWnd, 0, hInstance, nil);
hButton2:= CreateWindow("button", "Close", WS_CHILD or WS_VISIBLE, 200, 40, 70, 25, hMainWnd, 0, hInstance, nil);
hEdit1:= CreateWindowEx(WS_EX_CLIENTEDGE, "edit", nil, WS_CHILD or WS_VISIBLE or WS_BORDER, 20, 10, 150, 25, hMainWnd, 0, hInstance, nil);
hEdit2:= CreateWindowEx(WS_EX_CLIENTEDGE, "edit", nil, WS_CHILD or WS_VISIBLE or WS_BORDER or ES_READONLY, 20, 40, 150, 25, hMainWnd, 0, hInstance, nil);
hStatic:= CreateWindow("static", "Ïðè íàæàòèè íà êíîïêó Copy, òåêñò èç ïåðâîãî ïîëÿ ââîäà êîïèðóåòñÿ âî âòîðîå.",
       WS_CHILD or WS_VISIBLE or SS_CENTER, 20, 70, 150, 70, hMainWnd, 0, hInstance, nil);

// âûâîäèì íà ýêðàí è ïåðåðèñîâûâàåì îêíî
ShowWindow(hMainWnd, CmdShow);
UpdateWindow(hMainWnd);

// öèêë ñîîáùåíèé
while(GetMessage(msg, 0, 0, 0)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;

end.



 
Comp ©   (2004-09-27 01:07) [8]

Мужики, файл манифеста есть. В ресурсном файле.
Но не хотят почему то кнопочки отрисовываться. Хоть убей.
Может что не так делаю?
Я вставляю строчку {$R WindowsХР.RES} после {$R *.RES} и все.
Окно чистое.


 
Yanis ©   (2004-09-27 01:08) [9]

Странно.


 
Comp ©   (2004-09-27 01:14) [10]

Yanis, ну код вроде бы правильный. Все как должно. У меня Делфи 7.
А беда не отстает...


 
Yanis ©   (2004-09-27 02:38) [11]

Геморно конечно, но твою проблему я только так смог решить.

Скачивай прирмер:
http://actualsoft.narod.ru/Sample.rar
И нужные к нему юниты:
http://actualsoft.narod.ru/units.rar


 
Yuri Btr ©   (2004-09-27 10:16) [12]

Совершенно правильное замечание высказал Comp
У меня та же самая проблема.
При создании окон например из ресурсов (dialog template) при подключенном файле манифеста происходит крах приложения....
Хотя всё исключительно "микрософтовские штучки" :)


 
Yuri Btr ©   (2004-09-27 10:34) [13]

Все ясно, нужно вызвать  SetWindowTheme , который описан в библиотеке EldoS, но не проще (бесплатней) взять описание в Jedi Win32 API
там есть JwaUxTheme, где и описана эта ф-ия


 
Users   (2004-09-27 11:14) [14]

Попробуйте сделать вызов на окне:

  WM_CREATE:
     Begin
       InitCommonControls;
       ...
     End;

у меня был подобный глюк. Процедура в CommCtrl.pas, но чтоб его не тащить можно выдрать в свой модуль.


 
Users   (2004-09-27 11:16) [15]

Interface
...

Procedure InitCommonControls; StdCall;

...
Implementation

Procedure InitCommonControls; External "comctl32.dll" name "InitCommonControls";


 
Comp ©   (2004-09-27 12:36) [16]

Все перепробую, пересмотрю, если что, напишу.
Если получится - то только благодарности...!


 
Comp ©   (2004-09-27 16:13) [17]

Yanis, ты молодец.
 Экзешник запускается, все ништяк работает.
Тока прикинь, открываю проект, копирую файлы из папки Users в рабочую, компилирую и все.
Та же беда. Может что делфи не так или Windows...


 
Comp ©   (2004-09-27 16:27) [18]

Users, процедура игнорируется.

Может что не так.

program window;

uses
 windows,
 messages,CommCtrl;

{$R *.RES}
var
   wcl: TWNDCLASS;
   msg: TMSG;
   hMainWnd, hButton1, hButton2, hEdit1, hEdit2, hStatic: HWND;
   szWinName: PCHAR;
   szBuff: array[0 .. 18] of char;

procedure WindowFunc(hMainWnd: HWND; iMsg: integer; wParam: WPARAM; lParam: LPARAM); stdcall;
Begin
case iMsg of
   WM_DESTROY: PostQuitMessage(0);
   WM_CREATE:
    Begin
      InitCommonControls;
    End;

   WM_COMMAND:
   begin
       if (HWND(lParam) = hButton2) and (wParam = HIWORD(BN_CLICKED)) then PostQuitMessage(0);

       if (HWND(lParam) = hButton1) and (wParam = HIWORD(BN_CLICKED)) then
           begin
               GetWindowText(hEdit1, szBuff, 18);
               SetWindowText(hEdit2, szBuff);
           end;
   end

   else
   DefWindowProc(hMainWnd, iMsg, wParam, lParam);
   end;
End;

begin

szWinName := "MyClass";

wcl.hInstance:= hInstance;
wcl.lpszClassName:= szWinName;
wcl.lpfnWndProc:= @WindowFunc;
wcl.style:= 0;
wcl.hIcon:= LoadIcon(0, IDI_ASTERISK);
wcl.hCursor:= LoadCursor(0,IDC_ARROW);
wcl.lpszMenuName:= nil;
wcl.cbClsExtra:= 0;
wcl.cbWndExtra:= 0;
wcl.hbrBackground:= COLOR_WINDOW;
RegisterClass(wcl);

hMainWnd:= CreateWindow(szWinName, "Ïðîñòîå îêíî íà API.", (WS_OVERLAPPEDWINDOW xor WS_THICKFRAME xor WS_MAXIMIZEBOX),
                       CW_USEDEFAULT, CW_USEDEFAULT,
                       300, 170, 0, 0, hInstance, nil);

hButton1:= CreateWindow("button", "Copy", WS_CHILD or WS_VISIBLE, 200, 10, 70, 25, hMainWnd, 0, hInstance, nil);
hButton2:= CreateWindow("button", "Close", WS_CHILD or WS_VISIBLE, 200, 40, 70, 25, hMainWnd, 0, hInstance, nil);
hEdit1:= CreateWindowEx(WS_EX_CLIENTEDGE, "edit", nil, WS_CHILD or WS_VISIBLE or WS_BORDER, 20, 10, 150, 25, hMainWnd, 0, hInstance, nil);
hEdit2:= CreateWindowEx(WS_EX_CLIENTEDGE, "edit", nil, WS_CHILD or WS_VISIBLE or WS_BORDER or ES_READONLY, 20, 40, 150, 25, hMainWnd, 0, hInstance, nil);
hStatic:= CreateWindow("static", "Ïðè íàæàòèè íà êíîïêó Copy, òåêñò èç ïåðâîãî ïîëÿ ââîäà êîïèðóåòñÿ âî âòîðîå.",
       WS_CHILD or WS_VISIBLE or SS_CENTER, 20, 70, 150, 70, hMainWnd, 0, hInstance, nil);
ShowWindow(hMainWnd, CmdShow);
UpdateWindow(hMainWnd);

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

end.


 
Comp ©   (2004-09-27 16:33) [19]

Yuri Btr, а где её вызывать? Модули эти у меня есть, процедуру я нашел.
В процессе создания окна?
WM_CREATE


 
Users   (2004-09-27 17:08) [20]

Что значит "процедура игнорируется". Должно работать.
Я тебе на email пример рабочий выслал.


 
Lin7   (2004-09-27 17:22) [21]


> Comp ©   (26.09.04 18:02)


Может эта информация окажется полезной :)
http://www.akzhan.midi.ru/devcorner/articles/Windows%20Visual%20Styles%20(Themes)%20API%20Support%20in%20Your%20controls .htm


 
Comp ©   (2004-09-27 17:26) [22]

Lin7, спасибо, я её всю перечитал почти. Она по всему инету эта статья разослана. Больше никто эти темы не поднимал.


 
Lin7   (2004-09-27 17:29) [23]


> Comp ©   (27.09.04 17:26) [22]
> ... Больше никто эти темы не поднимал

В своё время искал и тоже больше ничего не нашёл :(


 
Comp ©   (2004-09-27 17:50) [24]

НУ ВСЕ!!!!!!!!!!!!

ЗАРАБОТАЛО!

СПАСИБО USERS!

Именно благодаря этому человеку вопрос фактически решен, и данная тема закрывается.

СПАСИБО ВСЕМ, КТО УЧАВСТВОВАЛ И ДАВАЛ СОВЕТЫ!

Dimaxx

Yuri Btr ©

Yanis ©

Cobalt ©

Users

Lin7


 
Comp ©   (2004-09-27 17:50) [25]

Удалено модератором
Примечание: Дубль



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

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.023 c
1-1097705573
saNat
2004-10-14 02:12
2004.10.31
Как убрать курсор в TMemo


14-1097137982
КаПиБаРа
2004-10-07 12:33
2004.10.31
Пишу ТЗ.


6-1093423322
RaPtoR_1
2004-08-25 12:42
2004.10.31
считывание из окна ие


10-1054293402
DreamDesire
2003-05-30 15:16
2004.10.31
Разнородные DCom клиент и сервер (в т.ч. в Midas)


1-1098000661
Ralf
2004-10-17 12:11
2004.10.31
Текстовые редакторы