Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите новичку(системное меню)

69K
11 апреля 2011 года
kolom
6 / / 11.04.2011
Дан исходный текст программы:
#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);}

Нужно один пункт убрать из системного меню и один добавить!
Заранее благодарен!!
278
11 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
GetSystemMenu() - получить дескриптор системного меню.
RemoveMenu() - удалить пункт меню.
InsertMenuItem() - добавить пункт меню.
69K
11 апреля 2011 года
kolom
6 / / 11.04.2011
Спасибо огромное!
Ну эту инфу найти можно в инете,а кто может хотя бы с примерами скинуть что-то...
какие переменные обьявлять,что в скобках GetSystemMenu().....?
278
11 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
Ну вряд ли напишу больше, чем написано по тем ссылкам, которые я вам сбросил. :) Попробую...

Код:
// пусть 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;
}
69K
12 апреля 2011 года
kolom
6 / / 11.04.2011
выбивает ошибку...
я в win api полный балбес...
ругается на "BOOL"
DoSomeActionsWithSystemMenu()-это название функции?
Alexander92,можете попробовать вставить ваш код в мой...чтоб оно работало без лагов...
Буду очень признателен!!!
278
12 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
Вы в чем компилируете? Вообще-то, BOOL объявлен в windef.h.

[QUOTE=kolom]
я в win api полный балбес...
можете попробовать вставить ваш код в мой...чтоб оно работало без лагов...
[/QUOTE]
Та вставить-то не проблема, только там еще придется много чего писать, типа кнопочек и/или пунктов меню каких-нибудь или акселераторов. Только толку вам с этого будет?
69K
12 апреля 2011 года
kolom
6 / / 11.04.2011
поймите
это результат кода,который я написал в первом посте.
http://www.fotolinker.ru/show-image.php?id=73f7b410e5a60526b3cfafea17f3bd05
это обычное окно с обычным стандартным системным меню(на скрине это видно)...
мне нужно вместо пункта переместить сделать какойто другой пункт,чтоб он чтото выполнял(в принципе не важно даже что)....
чесно говоря это по курсаку...
задание:
написать программу-калькулятор имеющуую свое системное и временное меню...
вот проблема с системным...
278
12 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
А теперь и вы поймите: писать за вас курсовую работу вряд ли здесь кто-то будет. Я вам предоставил предостаточно материалов, чтобы не лениться, а пойти, разобраться и написать, как положено, вашу курсовую. Я думаю, что ни один уважаемый участник этого форума не сможет меня упрекнуть в том, что я дал вам мало подсказок и ссылок для решения вашей задачи.

P.S. [offtop]Возможно, я действительно не понимаю чего-то в современной психологии... Но мне было бы искренне стыдно идти на форум и говорить, что я "полный балбес". Я бы перелопатил всю литературу, которая у меня есть, прежде чем такое сделать.[/offtop]
69K
13 апреля 2011 года
kolom
6 / / 11.04.2011
Согласен...но вы же прочитали условие курсовой,я спрашивал сдесь именно по системному меню...то,что вы мне предоставили достаточно материала это факт,но и факт то,что исходя из этого материала фиг что поймешь!!!согласны?
278
13 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
Нет, не согласен. Я предоставил материал для работы с меню в принципе + как получить доступ конкретно к системному меню. Чего вам еще не хватает? Времени почитать MSDN? Или лень родилась раньше нас?

[QUOTE=kolom]
DoSomeActionsWithSystemMenu()-это название функции?
[/QUOTE]
Я искренне не знаю, на каком уровне нужно объяснять материал человеку, который, будучи студентом-программистом, задает подобные вопросы.

Я еще раз повторяю: если есть КОНКРЕТНЫЙ вопрос - задавайте его, я на него отвечу. А с вопросом "как работать с системным меню?" я вас отправлю вот сюда, и мне думается, что буду прав. Ни один человек не напишет вам больше, чем написано там. Прочтите, разберитесь, потом приходите с конкретными вопросами. Покажите мне пальцем, где я неправ?

И скажите, что вам непонятно из того кода, который я вам написал? И подумайте, могу ли я объяснить лучше, если вы не владеете концепциями WinAPI?
69K
13 апреля 2011 года
kolom
6 / / 11.04.2011
добавить пункт меню смог сам...
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 и для чего он мне нужен был или все еще нужен я не понял.
Спасибо!
278
13 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
Я не говорил, что я гений, здесь есть люди, которые гораздно опытнее меня.
А суть в том, что вы практически уже сделали сами то, что вам было нужно. Что и требовалось доказать. :)

Теперь добавьте еще обработчик WM_COMMAND, чтобы отлавливать нажатие на ваш новый пункт.

 
Код:
// ...
  case WM_COMMAND:
    switch(LOWORD(wParam)) {
      case CM_FILENEW:
        MessageBox(hwnd, "Была выбрана команда создания нового файла.", szWindowTitle, MB_OK | MB_ICONINFORMATION);
        break;
    }
    break;


P.S. Используйте лучше InsertMenuItem вместо InsertMenu, у нее больше возможностей. Если бы вы поняли, что такое MSDN, вы бы там это нашли. =)
8.2K
09 мая 2011 года
user1
71 / / 16.03.2007
Est primer !

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.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог