SystemMenu ot klaviqturata
8 отговора
224 прегледа
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]
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]
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 :)
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 :)
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]
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]
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...
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...
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


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
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]
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]
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
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
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]
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 на