// пусть hwnd - дескриптор вашего окна, возвращаемый из CreateWindow() - глобальная переменная
BOOL DoSomeActionsWithSystemMenu() {
HMENU hSystemMenu = INVALID_HANDLE_VALUE;
MENUITEMINFO menuItemInfo = {0};
// получить системное меню
hSystemMenu = GetSystemMenu(hwnd, FALSE);
if (!hSystemMenu)
return FALSE;
// удалить первый пункт в этом меню
if (!RemoveMenu(hSystemMenu, 0, MF_BY_POSITION))
return FALSE;
// добавить какой-нибудь пункт в конец
menuItemInfo.cbSize = sizeof(MENUITEMINFO);
menuItemInfo.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID;
menuItemInfo.fType = MFT_STRING;
// идентификаторы пунктов системного меню, как учит нас великий MSDN, должны быть _меньше_ 0xF000
menuItemInfo.wID = 0xA000;
menuItemInfo.dwTypeData = "My menu item";
menuItemInfo.cch = lstrlen(menuItemInfo.dwTypeData);
if (!InsertMenuItem(hSystemMenu, GetMenuItemCount(hSystemMenu), TRUE, &menuItemInfo))
return FALSE;
// перерисовать меню
DrawMenuBar(hwnd);
return TRUE;
}
Помогите новичку(системное меню)
#define STRICT
#include <windows.h>
#include <mem.h>
BOOL InitApp(HINSTANCE);
LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM);
char const szClassName[] = "WindowAppClass";
char const szWindowTitle[] = "Окно Windows";
#pragma argsused
int PASCAL
WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{ MSG msg;
HWND hwnd;
if(!hPrevInstance)
{
if(!InitApp(hInstance)) return FALSE; }
else { MessageBox(NULL, "Можно запускать только одну копию приложения",
"Ошибка", MB_OK | MB_ICONSTOP);
return FALSE; }
hwnd = CreateWindow( szClassName, szWindowTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
0, 0, hInstance, NULL);
if(!hwnd) return FALSE;
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, 0, 0, 0))
{ DispatchMessage(&msg); }
return msg.wParam;}
BOOL
InitApp(HINSTANCE hInstance)
{ ATOM aWndClass;
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.style = 0;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = (LPSTR)NULL;
wc.lpszClassName = (LPSTR)szClassName;
aWndClass = RegisterClass(&wc);
return (aWndClass != 0);}
LRESULT CALLBACK _export
WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0; } }
return DefWindowProc(hwnd, msg, wParam, lParam);}
Нужно один пункт убрать из системного меню и один добавить!
Заранее благодарен!!
GetSystemMenu() - получить дескриптор системного меню.
RemoveMenu() - удалить пункт меню.
InsertMenuItem() - добавить пункт меню.
RemoveMenu() - удалить пункт меню.
InsertMenuItem() - добавить пункт меню.
Ну эту инфу найти можно в инете,а кто может хотя бы с примерами скинуть что-то...
какие переменные обьявлять,что в скобках GetSystemMenu().....?
Ну вряд ли напишу больше, чем написано по тем ссылкам, которые я вам сбросил. :) Попробую...
я в win api полный балбес...
ругается на "BOOL"
DoSomeActionsWithSystemMenu()-это название функции?
Alexander92,можете попробовать вставить ваш код в мой...чтоб оно работало без лагов...
Буду очень признателен!!!
[QUOTE=kolom]
я в win api полный балбес...
можете попробовать вставить ваш код в мой...чтоб оно работало без лагов...
[/QUOTE]
Та вставить-то не проблема, только там еще придется много чего писать, типа кнопочек и/или пунктов меню каких-нибудь или акселераторов. Только толку вам с этого будет?
это результат кода,который я написал в первом посте.
http://www.fotolinker.ru/show-image.php?id=73f7b410e5a60526b3cfafea17f3bd05
это обычное окно с обычным стандартным системным меню(на скрине это видно)...
мне нужно вместо пункта переместить сделать какойто другой пункт,чтоб он чтото выполнял(в принципе не важно даже что)....
чесно говоря это по курсаку...
задание:
написать программу-калькулятор имеющуую свое системное и временное меню...
вот проблема с системным...
P.S. [offtop]Возможно, я действительно не понимаю чего-то в современной психологии... Но мне было бы искренне стыдно идти на форум и говорить, что я "полный балбес". Я бы перелопатил всю литературу, которая у меня есть, прежде чем такое сделать.[/offtop]
Согласен...но вы же прочитали условие курсовой,я спрашивал сдесь именно по системному меню...то,что вы мне предоставили достаточно материала это факт,но и факт то,что исходя из этого материала фиг что поймешь!!!согласны?
[QUOTE=kolom]
DoSomeActionsWithSystemMenu()-это название функции?
[/QUOTE]
Я искренне не знаю, на каком уровне нужно объяснять материал человеку, который, будучи студентом-программистом, задает подобные вопросы.
Я еще раз повторяю: если есть КОНКРЕТНЫЙ вопрос - задавайте его, я на него отвечу. А с вопросом "как работать с системным меню?" я вас отправлю вот сюда, и мне думается, что буду прав. Ни один человек не напишет вам больше, чем написано там. Прочтите, разберитесь, потом приходите с конкретными вопросами. Покажите мне пальцем, где я неправ?
И скажите, что вам непонятно из того кода, который я вам написал? И подумайте, могу ли я объяснить лучше, если вы не владеете концепциями WinAPI?
Alexander92, посмотрите на название темы...
Я понял,что вы великий гений я вам не ровня,а я где-то про это говорил?
если для вас этот вопрос-это раз плюнуть,для вас сложно было скинуть какойто работающий пример?
я бы сам разобрался и применил его для своей работы...
вот код:
#define STRICT
#include <windows.h>
#include <mem.h>
#define CM_FILENEW 3
HMENU a;
BOOL InitApp(HINSTANCE);
LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM);
char const szClassName[] = "WindowAppClass";
char const szWindowTitle[] = "Окно Windows";
#pragma argsused
int PASCAL
WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{ MSG msg;
HWND hwnd;
if(!hPrevInstance)
{
if(!InitApp(hInstance)) return FALSE; }
else { MessageBox(NULL, "Можно запускать только одну копию приложения",
"Ошибка", MB_OK | MB_ICONSTOP);
return FALSE; }
hwnd = CreateWindow( szClassName, szWindowTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
0, 0, hInstance, NULL);
if(!hwnd) return FALSE;
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, 0, 0, 0))
{ DispatchMessage(&msg); }
return msg.wParam;}
BOOL
InitApp(HINSTANCE hInstance)
{ ATOM aWndClass;
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.style = 0;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = (LPSTR)NULL;
wc.lpszClassName = (LPSTR)szClassName;
aWndClass = RegisterClass(&wc);
return (aWndClass != 0);}
LRESULT CALLBACK _export
WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
{
a=GetSystemMenu(hwnd, FALSE);
InsertMenu(a,8,MF_ENABLED | MF_POPUP ,CM_FILENEW ,"NNNN");
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0; } }
return DefWindowProc(hwnd, msg, wParam, lParam);}
что такое MSDN и для чего он мне нужен был или все еще нужен я не понял.
Спасибо!
А суть в том, что вы практически уже сделали сами то, что вам было нужно. Что и требовалось доказать. :)
Теперь добавьте еще обработчик WM_COMMAND, чтобы отлавливать нажатие на ваш новый пункт.
Код:
// ...
case WM_COMMAND:
switch(LOWORD(wParam)) {
case CM_FILENEW:
MessageBox(hwnd, "Была выбрана команда создания нового файла.", szWindowTitle, MB_OK | MB_ICONINFORMATION);
break;
}
break;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case CM_FILENEW:
MessageBox(hwnd, "Была выбрана команда создания нового файла.", szWindowTitle, MB_OK | MB_ICONINFORMATION);
break;
}
break;
P.S. Используйте лучше InsertMenuItem вместо InsertMenu, у нее больше возможностей. Если бы вы поняли, что такое MSDN, вы бы там это нашли. =)
http://sources.codenet.ru/download/3915/Icons_Extractor.html
Programma napisana na C#, no pochti vsya ee rabota osnovana na WinAPI funkciyax s pomoschu DllImport.
Tam est kod po dobavleniu svoego punkta v sistemnoe kontekstnoe menu.