WindowsAPI ポップアップメニュー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ma

WindowsAPI ポップアップメニュー

#1

投稿記事 by Ma » 15年前

DXライブラリで作られたプログラムに、右クリックで表示されるポップアップメニュー作ろうと思ってます。

環境
VC++ 2008 Express Edition

Windows API についての知識は、
http://wisdom.sakura.ne.jp/system/winap ... index.html
ここの60章ぐらいまで軽く読んだ程度です。
(長くて、なかなか最後まで読めない^^;)


で、
最初はここにつき
http://www.ne.jp/asahi/hishidama/home/t ... pmenu.html
これを見てまねてみようと思ったが、CView クラスがみつからないし、何をインクルードするべきかがあやふやだし、
とりあえずもう少し初心者用のページを探すことに。


http://www.alpha-net.ne.jp/users2/uk413 ... popup.html
ここにつき、やっぱりリソースいじったほうがよさそうなのが分かりました。
(BCCでアイコンを使う時以外でリソースをいじったことありません)

それで、リソースにメニューってどうやって作るんだろうってことでたどりついたのがこちらのサイト
http://homepage2.nifty.com/c_lang/resource.htm
環境が古くて、あまり参考にならない。。。。orz


調べていくうちに、ソリューションエクスプローラーのリソースにメニューを追加することから始めればいいことがわかったんですが、
リソースフォルダー(フィルター?)は表示されているのだが、メニュー追加の項目がない・・・
ソリューションエクスプローラーのプロジェクト右クリックし、追加→リソースがあるのですが
なぜか、無効化していてクリックできない。
リソースフィルターを右クリックし、追加→でやると新しい項目にはWindowsフォームやプロパティシートがでてくる。


VC++ のヘルプで検索してみるが、やはり関連ページ見つけるのに一苦労して、見つけても必要がない情報が多かったり、難しくて何をいっているのかよくわからないことがおおい。orz


このような状況ですが、私に役立ちそうなサイトの紹介、または次のステップを教えてください。
(やっぱり、基礎からの学習でしょうかね^^;) 画像

Ma

Re:新規メニューボタンはどこ・・・orz

#2

投稿記事 by Ma » 15年前

あぁ、すいません。
よくよく見たら、自分がAPI勉強用に使っていたページにポップアップがありました。
http://wisdom.sakura.ne.jp/system/winap ... win78.html
つい、チェックし忘れてました。

これを読んでみて、わからなかったらもう一度聞きますね。それまで解決にしておきます。 画像

たいちう

Re:新規メニューボタンはどこ・・・orz

#3

投稿記事 by たいちう » 15年前

> これを見てまねてみようと思ったが、CView クラスがみつからないし、
> 何をインクルードするべきかがあやふやだし、
> とりあえずもう少し初心者用のページを探すことに。

CViewはMFCのクラスでして、無料であるExpress Editionには含まれません。
リソースエディタも無いんじゃなかったかな。
私は普通のテキストエディタで作成し、VCでコンパイルしています。

コンテキストメニューのサンプル
http://homepage2.nifty.com/c_lang/sdk/sdk_44.htm

Ma

Re:新規メニューボタンはどこ・・・orz

#4

投稿記事 by Ma » 15年前

>たいちうさん
回答ありがとうございます。
やっぱり某サイトにもありましたか、今つまづいている問題を解決次第しっかり読んでいこうと思います。

>私は普通のテキストエディタで作成し、VCでコンパイルしています。
ようやく、スタートラインにたてた感じですw
さきほど、.rcファイル作ってアイコンの変更に成功したので、このままつきすすんでいきますよ!(笑

また問題にぶちあたったら質問しますので、そのときはよろしくおねがいします。

Ma

Re:新規メニューボタンはどこ・・・orz

#5

投稿記事 by Ma » 15年前

HMENU hmenu = LoadMenu(GetTaskInstance(), "MYPOPUP");


こうやってロードしたんですが、戻り値が エラー、評価できません になってしまいました。

リソースコードは以下のとおり


#include <windows.h>
#include "resource.h"

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

MYPOPUP MENU DISCARDABLE
BEGIN
POPUP "表示されません"
BEGIN
MENUITEM "終了\tShift + Ctrl + X", IDM_END
POPUP "オプション"
BEGIN
MENUITEM "猫の絵\tF1", IDM_CAT
MENUITEM "犬の絵\tF2", IDM_DOG
MENUITEM "ネズミの絵\tF3", IDM_RAT
MENUITEM "消去\tEsc", IDM_CLR
END
END
END


何か間違っていますか?
(ちなみにコンパイルはしっかりとおりました。)


表示部分は
HMENU hmenu = LoadMenu(GetTaskInstance(), TEXT("MYPOPUP"));
HMENU hSubmenu = GetSubMenu(hmenu, 0);
TrackPopupMenu(hSubmenu, TPM_LEFTALIGN, MousePosX, MousePosY, 0, GetMainWindowHandle(), NULL);
DestroyMenu(hmenu);
このように実装するつもりでした。


何か、問題点としておもいつくことはないでしょうか? 画像

Ma

Re:新規メニューボタンはどこ・・・orz

#6

投稿記事 by Ma » 15年前

DXライブラリとの相性もありそうなので、DXライブラリ掲示板とのマルチポストさせていただきます。
ただし、リンクの配置、また両方を確認する前提で行いますので、ご了承お願いします。

http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=1657

たいちう

Re:新規メニューボタンはどこ・・・orz

#7

投稿記事 by たいちう » 15年前

レスがないですね。
私も帰宅しないと試せる環境にないのですが、
昨日も深夜帰宅で気力がありませんでした。

DXライブラリを使わずに、ポップアップの表示だけ行うことはできましたか?

Ma

Re:新規メニューボタンはどこ・・・orz

#8

投稿記事 by Ma » 15年前

>DXライブラリを使わずに、ポップアップの表示だけ行うことはできましたか?

できるだろう。なんておもっていてやってみたら、同じエラーが出ました^^;
ということは、やり方に問題があるわけで。。。。

リソースファイルを使う時って、プロジェクトの設定に何かしないといけなかったりしますか?
いっそのことプロジェクトアップしたほうがいいでしょうか?

どうせ短いので、やっぱりこぴぺします。

//Resource.h
#define MYPOPUP 101
#define IDM_END 102
#define IDM_CAT 103
#define IDM_DOG 104
#define IDM_RAT 105
#define IDM_CLR 106


//main.cpp
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
POINT po;
static HMENU tmp , hmenuR , hmenuL;

switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
tmp = LoadMenu(((LPCREATESTRUCT)(lp))->hInstance , TEXT("MYPOPUP"));
hmenuR = GetSubMenu(tmp , 0);
hmenuL = GetSubMenu(tmp , 1);
return 0;
case WM_RBUTTONUP:
po.x = LOWORD(lp);
po.y = HIWORD(lp);
ClientToScreen(hwnd , &po);
TrackPopupMenu(hmenuR , TPM_LEFTALIGN | TPM_BOTTOMALIGN ,
po.x , po.y , 0 , hwnd , NULL
);
return 0;
case WM_LBUTTONUP:
po.x = LOWORD(lp);
po.y = HIWORD(lp);
ClientToScreen(hwnd , &po);
TrackPopupMenu(hmenuL , TPM_LEFTALIGN | TPM_BOTTOMALIGN ,
po.x , po.y , 0 , hwnd , NULL
);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;

winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");

if (!RegisterClass(&winc)) return -1;

hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL
);

if (hwnd == NULL) return -1;

while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}



//Resource.rc
#include <windows.h>
#include "Resource.h"


MYPOPUP MENU DISCARDABLE
BEGIN
POPUP "表示されません"
BEGIN
MENUITEM "終了\tShift + Ctrl + X", IDM_END
POPUP "オプション"
BEGIN
MENUITEM "猫の絵\tF1", IDM_CAT
MENUITEM "犬の絵\tF2", IDM_DOG
MENUITEM "ネズミの絵\tF3", IDM_RAT
MENUITEM "消去\tEsc", IDM_CLR
END
END
END
画像

softya

Re:新規メニューボタンはどこ・・・orz

#9

投稿記事 by softya » 15年前

こうすれば動きますよ。
ポイントは、LoadMenuのMAKEINTRESOURCE()です。
http://wisdom.sakura.ne.jp/system/winap ... win72.html

#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
POINT po;
static HMENU tmp , hmenuR , hmenuL;

switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
tmp = LoadMenu(((LPCREATESTRUCT)(lp))->hInstance , MAKEINTRESOURCE(MYPOPUP));
hmenuR = GetSubMenu(tmp , 0);
hmenuL = GetSubMenu(tmp , 1);
return 0;
case WM_RBUTTONUP:
po.x = LOWORD(lp);
po.y = HIWORD(lp);
ClientToScreen(hwnd , &po);
TrackPopupMenu(hmenuR , TPM_LEFTALIGN | TPM_BOTTOMALIGN ,
po.x , po.y , 0 , hwnd , NULL
);
return 0;
case WM_LBUTTONUP:
po.x = LOWORD(lp);
po.y = HIWORD(lp);
ClientToScreen(hwnd , &po);
TrackPopupMenu(hmenuL , TPM_LEFTALIGN | TPM_BOTTOMALIGN ,
po.x , po.y , 0 , hwnd , NULL
);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS winc;

winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");

if (!RegisterClass(&winc)) return -1;

hwnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL
);

if (hwnd == NULL) return -1;

while(GetMessage(&msg , NULL , 0 , 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

Ma

Re:新規メニューボタンはどこ・・・orz

#10

投稿記事 by Ma » 15年前

できました!
なるほどー、だからTEXTじゃぁだめだったのか。
時間あるときに、DXライブラリのバージョンでも試してみます。(いまはちょっと時間なくて^^;)

ありがとうございました。

Ma

Re:新規メニューボタンはどこ・・・orz

#11

投稿記事 by Ma » 15年前

全部うまくいきました!
ありがとうございました。
やはり、WindowsはCを覚えるようには簡単にいきませんね^^;

もう片方のスレでも報告してきます。 画像

閉鎖

“C言語何でも質問掲示板” へ戻る