SystemMenu ot klaviqturata

8 отговора 224 прегледа
#1

SystemMenu ot klaviqturata

Kak da izkaram system menu na prozorec?

Imam prozorec bez caption. Slojil sum si ikonka na programata v leviq ugul i iskam da imitira ikonata na standartnite prozorci: na click da izkara systemmenu a pri double-click - close.

Probvah purvo s WM_SYSCOMMAND i SC_KEYMENU obache neshte. Probvah i SC_MOUSEMENU i pak nishto.

Sega go napravih sus keybd_event s natiskane na Alt+Space, no taka ne moga da obrabotq double-click.

Nqkoi znae li kak moje da stane ?

Blagodarq predvaritelno...

by Wise Guy
[email protected]
Отговор
в отговор на WiseGuy #2

Re: SystemMenu ot klaviqturata

razgledai helpa na
WM_NCLBUTTONDOWN, WM_NCHITTEST
az ne sym probwal da wikam system menu a z dragwane na prozoreca
no mislia che shte raboti :)
prosto mu sendwash msg che si clicknal na menuto :)

Отговор
в отговор на emo #3

Ne stava

Mi ne stava

WM_NCLBUTTONDOWN sus HTSYSMENU ne shte. Mai ne moje kato proveri koordinatite da dade che e na iconata.

Proba sus hittest pri obrabotkata na suobshteniqta. Problema e 4e hittest izobshto ne se vika (kato mu slojih edin breakpoint)

//sysmenu
if Message.Msg = WM_NCHITTEST then
begin
if (Message.LParamLo in [4..20]) and //poziciqta po X
(Message.LParamHi in [2..18]) then //poziciqta po Y
Message.Result := HTSYSMENU;
end;

Gadnoto e che nqmam Caption Area za WM_NC...

by Wise Guy
[email protected]
Отговор
в отговор на Wise Guy #4

Re: Ne stava

mi... mai ne si me razbral prawilno :)
naprawih edno prosto win32 prolojenie "Hello world"
i w message loopa dobawih
case WM_LBUTTONDBLCLK :
SendMessage( hWnd, WM_NCLBUTTONDBLCLK, HTSYSMENU, 0 );
break;

a w window style dobawih CS_DBLCLKS
i sega kato double-click niakyde iz prozoreca, go zatwaria
wse edno sym doble-clicknal na sysmenuto....
i ne e neobhodimo da e widimo menuto...

Отговор
в отговор на WiseGuy #5

Probwai towa!

Hi, probwai towa, raboti!

Napisyl sym go na C++ i samo s API , ama ako tridwa da go pishesh na neshto drugo sigurno shte se orientirash, zashtoto ne e slojno.


case WM_RBUTTONDOWN:
if (natisnal si desniat button na mishkata wyrhu ikonata - proweriawash coordinatite na cursora)
{
sysmenu = GetSystemMenu (hWnd, FALSE);
GetCursorPos (&point); // pri tebe moje i bez towa
TrackPopupMenu (sysmenu, TPM_LEFTALIGN|TPM_TOPALIGN,
point.x, point.y, NULL, hWnd, NULL);
}
break;

case WM_COMMAND:
// ako si izbral CLOSE ot SYSTEM menuto se zatwaria prozoreca!
if ((wParam & 0xfff0) == SC_CLOSE) DestroyWindow(hWnd);
break;

case WM_LBUTTONDBLCLK:
if (ako si kliknal wyrhu iconata) DestroyWindow (hWnd);

//Za da raboti double-click , triabwa class-at na twoiat prozorez da e sys stil CS_DBLCLKS

break;


Uspeh

Отговор
в отговор на ArnOld #6

Ne iskam da imitiram Sysmenu

Iskam da izkaram Sysmenuto po nqkakuv nachin, a ne da imitiram sus TrackPopup...

Az double-click close-a lesno si go pravq, no iskam na click na control-a da mi izleze SystemMenu-to (to si izliza kude trqbva, no kato ispolzvam Alt+Space, za da go izvikam puk ne mi ba4ka double-click-a)

Trqbva mi alternativan na:
keybd_event(VK_MENU, 0, 0, 0);
keybd_event(VK_SPACE, 0, 0, 0);
keybd_event(VK_SPACE, 0, 2, 0);
keybd_event(VK_MENU, 0, 2, 0);

Nqkoi shte se seti li ?

by Wise Guy
[email protected]
Отговор
в отговор на Wise Guy #7

Re: Ne iskam da imitiram Sysmenu

Ne moga da razbera kawo zna4i da imitirash Sysmenu - to. Ili go pokazwash ili nishto ne stawa. Towa menu si e samo edno, kak taka shte go imitirash?

GetSystemMenu ti wryshta ukazatel kym systemnoto menu, syshtoto koeto se pokazwa kogato natisnesh ikonkata na prozoreca. A kogato imash tozi ukazatel ti ne imitirash menuto, a si rabotish s originalnoto system menu. Samo deto go pokazwash kogato ti si izkash, a ne kogato OS reshi

Отговор
в отговор на ArnOld #8

IZVINQVAI ArnOld

Ne usetih tochno kakvo pravi TrackPopupMenu. Sq kato mi go pisa tova i probvah primera ti i stana:

var
sysmenu: HMenu;
point: TPoint;
begin
sysmenu := GetSystemMenu(handle, FALSE);
GetCursorPos(point);
TrackPopupMenu (sysmenu, TPM_LEFTALIGN or TPM_TOPALIGN, point.x, point.y, 0, handle, nil);

Merci mnogo. Awe nqposleduk gledam che stavam tochno kakto horata koito ne haresvam... Kazvash mi neshto i bez da mu obrushtam mnogo vnimanie kazvam che e greshno... Trqbva da se opravq

Ei sq gledam che menu-to e falshivo i vidqh che trqbva da mu se dobavi v WndProc:
if Message.Msg = WM_COMMAND then
case (Message.wParam and $fff0) of
SC_MOVE: fmMain.Perform(WM_SYSCOMMAND, SC_MOVE, 0);
SC_SIZE: fmMain.Perform(WM_SYSCOMMAND, SC_SIZE, 0);
SC_MINIMIZE: fmMain.Perform(WM_SYSCOMMAND, SC_MINIMIZE, 0);
SC_CLOSE: fmMain.Perform(WM_SYSCOMMAND, SC_CLOSE, 0);
end;

10x ArnOLD
napisal si mi otgovora, a az NE ta ne

by Wise Guy
[email protected]

Редактирано от Wise Guy на

Отговор