WINVERとMENUITEMINFO構造体のエラー
- 現在、配列に格納された文字列・アイコンをメニューに動的に配置するコードを書いており、MENUITEMINFO構造体にBitmapハンドルを渡す必要がありますが、'tagMENUITEMINFOA' のメンバ 'hbmpItem' に関してエラーが発生し、停止します。
- windows.hはメインクラスのヘッダで定義しており、またwinuser.h内での定義も正常です。検索や過去の質問を当たってみたところ、特定DLLやSDKのヴァージョンが低いと類似の問題が発生することが判明しました。
- 具体的にどのファイルが問題か、あるいは根本的に何かが間違っているのかをご教示いただきたく、ご質問いたします。
- ベストアンサー
WINVER と MENUITEMINFO 構造体
現在、配列に格納された文字列・アイコンをメニューに動的に配置するコードを書いております。 その際、MENUITEMINFO構造体にBitmapハンドルを渡す必要があり、StdAfx.h 内の上部で #ifndef #define WINVER 0x500 #endif と行い、無事にMIIM_BITMAPマスクはコンパイルできました。 しかし構造体のhbmpItemに関してはコンパイル時 error C2039: 'hbmpItem' : 'tagMENUITEMINFOA' のメンバではありません。 とのエラーが発生し、停止します。 windows.hはメインクラスのヘッダで定義しており、またwinuser.h内での定義も正常です。 検索や過去の質問を当たってみたところ、特定DLLやSDKのヴァージョンが低いと 類似の問題が発生することが判明しました。 具体的にどのファイルが問題か、あるいは根本的に何かが間違っているのかをご教示いただきたく、ご質問いたします。 環境は Visual C++ SP6 (MFC/STL/API使用) Windows2000 SP4 (HotFix全適用) 使用ヘッダファイル windows.h shellapi.h shlwapi.h imagehlp.h direct.h (ライブラリ含む) コード使用場所 メインクラスのヘッダをインクルードした別クラス内関数 コードの一部を以下に記述します。 調整中のためマスクなどに問題がありますが、今回の問題と関係がなければ容認下さい。 //構築 MENUITEMINFO info; ZeroMemory(&info, sizeof(MENUITEMINFO)); info.cbSize = sizeof(MENUITEMINFO); info.fMask = MIIM_BITMAP | MIIM_TYPE; info.fType = MFT_STRING; info.fState = MFS_DEFAULT; info.dwTypeData = TEXT("test"); info.cch = lstrlen(TEXT("test")); info.hbmpItem = (HBITMAP)hBitmap; //Error InsertMenuItem(pMenu->GetSafeHmenu(), 0, TRUE, &info); ※上記Errorの部分をコメントアウトすると問題なくコンパイル・動作しますが、 ビットマップはもちろん表示されません。
- N_flick
- お礼率85% (12/14)
- C・C++・C#
- 回答数1
- ありがとう数2
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
_WIN32_WINNT の値はどうなっていますか? MENUITEMINFOは下記のように宣言されています。 typedef struct tagMENUITEMINFOA { ... #if (_WIN32_WINNT >= 0x0500) HBITMAP hbmpItem; // used if MIIM_BITMAP #endif } MENUITEMINFOA, FAR *LPMENUITEMINFOA;
関連するQ&A
- Win32APIにて、アイコンの情報を取得する方法を教えてください。
いつもお世話になっております。 只今、小生WindowsXPSP3上で、C言語とWin32APIを使い、BCC5.5.1でコンパイルし、Windowsプログラミングを勉強しています。 今回質問させて頂きたいのは、 「ウィンドウにアイコンを描画する際、 BitBlt関数の第4・5引数に指定する転送元画像の幅と高さを取得する 際にはどうすればいいか」 です。 例えば、ビットマップ画像の幅、高さを取得する際は、 GetObject(hBitmap, (int)sizeof(BITMAP), &bmp_info); をして、 w = bmp_info.bmWidth; h = bmp_info.bmHeight; とし、x, yをBitBlt関数の第4・5引数に指定する方法というのは知っているのですが、アイコンの場合はどのようにして、幅、高さを求められるのでしょうか?? 先輩方、ご教授宜しくお願い致します。
- ベストアンサー
- C・C++・C#
- ビットマップの描画について(Windowプログラミング)
おせわになります。 現在WIndows上で動作するソフトを作成しています。 ほとんど作成は終わっているのですが、作成したWindowsの上にビットマップを描画する部分で不安な点があります。 (これまであまり手をつけていなかったので) ネットなどを参考に作成したのですが、サンプルコードを見ていただいておかしいところを指摘していただければ幸いです。 以下のようなコードになります。 int ShowBMP(HWND hWnd, HDC hdc) { HDC hmdc; HBITMAP hBitmap; BITMAP bmp; HINSTANCE hInst; int BMP_W, BMP_H; hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); hBitmap = LoadBitmap(hInst, "TOPBMP"); GetObject(hBitmap, sizeof(BITMAP), &bmp); BMP_W = (int)bmp.bmWidth; BMP_H = (int)bmp.bmHeight; hmdc = CreateCompatibleDC(hdc); SelectObject(hmdc, hBitmap); BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY); DeleteDC(hmdc); DeleteObject(hBitmap); return 1; }
- ベストアンサー
- C・C++・C#
- ビットマップ画像表示
いつもお世話になっております。 VS2005でC++を用いてWindowsアプリケーションの作成をしています。 子ウィンドウにビットマップ画像(ファイル名:HELP.bmp)を 表示させようとプログラムを組んだのですが、 子ウィンドウを出してもビットマップ画像が表示されません。 以下のようなプログラムを追加しました。 --------------------------------- ///リソーススクリプト///////////////////////////////// IDB_BITMAP1 BITMAP DISCARDABLE "HELP.bmp" ///ヘッダースクリプト///////////////////////////////// #define IDB_BITMAP1 3000 ///ソーススクリプト/////////////////////////////////// void ShowMyBMP(HWND hWnd, HDC hdc){ HDC hmdc; HBITMAP hBitmap; BITMAP bmp; HINSTANCE hInst; int BMP_W, BMP_H; hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1)); //インスタンスハンドル取得 GetObject(hBitmap, sizeof(BITMAP), &bmp); //ビットマップの情報を得る BMP_W = (int)bmp.bmWidth; //画像の幅 BMP_H = (int)bmp.bmHeight; //画像の高さ hmdc = CreateCompatibleDC(hdc); //メモリデバイスコンテキストハンドルを取得 SelectObject(hmdc, hBitmap); BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY); StretchBlt(hdc, 0, BMP_H, BMP_W / 2, BMP_H / 2, hmdc, 0, 0, BMP_W, BMP_H, SRCCOPY); DeleteDC(hmdc); //デバイスコンテキストハンドルを開放 DeleteObject(hBitmap); return; } --------------------------------- ShowMyBMP関数は子ウィンドウを表示するときに実行されます。 全て載せられないので追加した部分のみプログラムを載せましたが、 この部分だけでも、プログラムの間違い等はありませんでしょうか。 ご教授お願いいたします。
- ベストアンサー
- C・C++・C#
- 動的に追加したポップアップメニューのオーナードロー
WindowsXp/BCC5.5の環境でアプリ作りを勉強しています。 「mi.fType = MFT_STRING」として、あらかじめ用意したポップアップメニューに動的にメニューを追加できるのですが、その追加したメニューにビットマップを付加するために、「mi.fType = MFT_OWNERDRAW」で追加したいのです。 しかし、これがうまくいきません。 追加じたいは出来るのですが、メニューIDがWM_MEASUREITEMのところに届いていないみたいで そのため、オーナードローできずにいます。 つまり、「WM_MEASUREITEM」は飛んできますが、メニューID((UINT) wp)はゼロのままです。 本当は「mi.wID = 1200」を取得したいんです。 そのため、ウインドウメッセージ、WM_MEASUREITEM、WM_DRAWITEMは 飛んできますが、オーナードローができず、困っております。 ポップアップメニュー追加のためのコード(以下抜粋)を記載しています。 どなたか、ご教授できないでしょうか。 宜しくお願いします。 <メニュー追加のためのコード> memset(&mi, 0, sizeof(MENUITEMINFO)); mi.cbSize=sizeof(MENUITEMINFO); mi.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; mi.fType = MFT_OWNERDRAW; mi.wID = 1200; InsertMenuItem(hSubMenu,0,TRUE,&mi ); 以上
- ベストアンサー
- C・C++・C#
- 構造体と構造体型の変数宣言箇所
はじめてborlandC++builder6でプログラムを作っているのですが、構造体と構造体型の変数宣言箇所についてわからないことがあるので質問させてください。 あるフォームのソースファイル(○○○.cpp)内の関数で、自分で定義した構造体を使う場合、ヘッダファイル(○○○.h)に構造体を定義すると、関数内で「変数が未定義」エラーになってしまいます。一方、ソースファイル(○○○.cpp)の先頭に書けばエラーになりません。 ヘッダファイルに変数定義した場合とソース内の先頭に構造体と構造体型変数を定義するのでは何が違ってくるのでしょうか?
- ベストアンサー
- C・C++・C#
- クラスのメンバ関数を別ファイルで定義したときのバグ
C++ においてヘッダファイルで宣言したクラスのメンバ関数を別のソースファイルで定義して、コンパイルするとうまくいきません。エラーは出ないのですが、同名の何もしない関数としてコンパイルされているようなのです。クラスのメンバ関数を宣言したのと同じヘッダに書くとちゃんとコンパイルされます。 どうしてそうなるのか、いまいち原因がわかりません。
- 締切済み
- C・C++・C#
- 構造体(study c)
現在、study cというものを使ってプログラミングをしているのですが、 どうしてもエラーの原因が分からないので質問させて頂きます。 #include <graph.h> struct blocks_info { bool enable; RECT bounds; }; main() { ・・・//省略 } このようにプログラムしているのですが、コンパイルすると、構造体の部分のbool enable;の行で、 この場所には;が必要です。とエラーが出ます。 ためしにbool enable;を消してコンパイルしてみると、今度は RECT bounds;の行で同じエラーが出ました。 その部分も消すと、};の行でまた同じエラーが出ました。 どなたかエラーの原因が分かる方いらっしゃいましたらご教授下さい。 よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- ヘッダファイルと構造体
typedef struct{ float x; float y; float z; }Point; typedef struct { struct Point p1; struct Point p2; }Rect; とヘッダファイルに入力しコンパイルしてみると struct Point p1; struct Point p2; のPointが未定義の構造体とエラーが出ます。 どのように書けばいいのでしょう??
- ベストアンサー
- C・C++・C#
- bitmap画像の保存がうまくいきません。
VC++のMFC、ダイアログベースで画像処理のソフトを作っています。 処理した画像を保存したいのですが、「描画できませんでした」というメッセージのでるファイルになってしまい、うまく保存できません。 プログラムは以下のようになっていてピクチャーコントロールの変数をm_pict8にしています。また、画像は24ビットで240×320のものを保存します。 static LONG CalcScanLineByte(const LONG w, const WORD bpp) { return (((bpp * w) + 31) / 32) * 4; } //----------------------------------------------------------- void Cstart2Dlg::OnBnClickedButton10() //保存ボタン { CFileDialog myDLG(FALSE,"BMP","*.BMP",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"画像(*.BMP)|*.BMP||"); if(myDLG.DoModal() == IDOK){ CStdioFile fout(myDLG.GetPathName(),CFile::modeCreate | CFile::modeWrite|CFile::typeBinary); //ピクチャボックスからビットマップを取り出す HBITMAP hBitmap = m_pict8.GetBitmap(); //無いので処理できない if(hBitmap == NULL)return; //ビットマップの情報を取る BITMAP bitmap = {0}; ::GetObject(hBitmap, sizeof(bitmap), &bitmap); //4バイト調整したスキャンラインのサイズ const int iScanLineByte = ::CalcScanLineByte(240, bitmap.bmBitsPixel); //const int iScanLineByte = ::CalcScanLineByte(bitmap.bmWidth, bitmap.bmBitsPixel); //ファイルヘッダとビットマップヘッダ BITMAPFILEHEADER bmfh = {sizeof(bmfh)}; BITMAPINFOHEADER bmif = {sizeof(bmif)}; //ビットマップである事を示す名称 bmfh.bfType = ('M' << 8) | 'B'; //イメージデータへのオフセットはファイルヘッダ+ビットマップヘッダ bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmif); //見ての通り bmif.biBitCount = 24; //24ビットの時はBI_RGBで固定 bmif.biCompression = BI_RGB; //常に1で固定 bmif.biPlanes = 1; //見ての通り bmif.biWidth = 240; bmif.biHeight= 320; //bmif.biWidth = bitmap.bmWidth; //bmif.biHeight= bitmap.bmHeight; //4バイト調整も含めた正確な合計バイトサイズが必要 bmif.biSizeImage = iScanLineByte * bmif.biHeight; //ファイルヘッダ→ビットマップヘッダの順番に書き出す fout.Write(&bmfh, sizeof(bmfh)); fout.Write(&bmif, sizeof(bmif)); //イメージデータをセーブする HDC hMemDC = ::CreateCompatibleDC(NULL); ::SelectObject(hMemDC, hBitmap); //yを縦幅-1から回転させないと上下逆転してしまう for(int y = bmif.biHeight - 1; y >= 0; --y) { //3バイトずつステップする for(int x = 0; x < iScanLineByte; x += 3) { const COLORREF cref = ::GetPixel(hMemDC, x / 3, y); //色素の位置関係をBGRにしないと赤と青の関係が逆転してしまう const BYTE arrBy[3] = {GetBValue(cref), GetGValue(cref), GetRValue(cref)}; //1ピクセル分(3バイト)書き出す fout.Write(arrBy, sizeof(arrBy)); } } ::DeleteDC(hMemDC); } どこか改善点などありましたら、よろしくお願いいたします。
- 締切済み
- C・C++・C#
お礼
お返事有り難うございます。遅れてしまい申し訳ありません。 ご指摘通りに _WIN32_WINNT の定義場所を確認しましたところ、 コード内で明示的に定義している場所はありませんでした。 またご指摘を頂きwinuser.hを再確認しましたところ、 どうやらWINVERの方ばかりに目に行ってしまい、見逃していたようです… WINVERの定義に続き #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x500 #endif と定義することにより、無事にコンパイルは通りました。 ハンドルが上手く作成されておらず、まだまだ長い道のりですが、 スバリの回答を頂きましたこと、感謝いたします。 今後は見落としが無いよう、尽力いたします。 有り難うございました。