ファイル保存のコモンダイアログ

名前を付けて保存のダイアログを表示します。
ちなみに、ファイル保存の処理をプログラムしないと実際には保存されません。
あしからず。。。

resource.h

 #define IDR_MENU1  100
 #define ID_EXIT   101
 #define ID_TEST   102
 #define ID_A   103
 #define ID_B   104
 #define ID_Menu   105
 #define ID_Whats  106
 #define ID_Help   107
 #define ID_STATUS  108
 #define ID_OPEN  109
 #define ID_SAVE  110

menu.rc

#include "resource.h"
 
IDR_MENU1 MENU
 BEGIN
     POPUP "File"
     BEGIN
   MENUITEM "開く",  ID_OPEN
   MENUITEM "名前を付けて保存",  ID_SAVE
         MENUITEM "Exit",    ID_EXIT
     END
     POPUP "Test"
     BEGIN
         MENUITEM "てすつ",    ID_TEST
     END
     POPUP "Option"
     BEGIN
         MENUITEM "A",     ID_A
         MENUITEM "B",     ID_B
         MENUITEM "めにゅ~",   ID_Menu
         MENUITEM "whats?",    ID_Whats
     END
     MENUITEM "ヘルプ",     ID_Help
 END

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib, "comctl32.lib")
#include <windows.h>
#include <GL/freeglut/freeglut.h>
#include "resource.h"
#include <commctrl.h> //CreateStatusWindow()のために必要
 

//FreeGlutのウインドウプロシージャを置き換える為の変数
WNDPROC WndProc=NULL; //元のウィンドウプロシージャ
HWND hWnd2=NULL; //ウィンドウハンドル
HMENU hMenu=NULL; //メニュー
HWND hStatusbar;     // ステータスバーのハンドル

//Windowのサイズ
int width = 320;
int height = 240;
 
//回転用
float anglex = 0.0f;
//白
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
 
//置き換えた後のプロシージャ
LRESULT CALLBACK WndProc2(HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam){
 static OPENFILENAME ofn;
 static TCHAR filename_full[MAX_PATH];   // ファイル名(フルパス)を受け取る領域
 static TCHAR filename[MAX_PATH];        // ファイル名を受け取る領域

 switch( msg ){
  case WM_SIZE:
   SendMessage( hStatusbar, WM_SIZE, wParam, lParam );
   return 0;
  case WM_COMMAND:
   switch (LOWORD(wParam)){
    case ID_SAVE:
    // 構造体に情報をセット
    ZeroMemory( &ofn, sizeof(ofn) );       // 最初にゼロクリアしておく
    ofn.lStructSize = sizeof(ofn);         // 構造体のサイズ
    ofn.hwndOwner = hWnd;                  // コモンダイアログの親ウィンドウハンドル
    ofn.lpstrFilter = L"All files(*.*)\0*.*\0\0"; // ファイルの種類
    ofn.lpstrFile = filename_full;         // 選択されたファイル名(フルパス)を受け取る変数のアドレス
    ofn.lpstrFileTitle = filename;         // 選択されたファイル名を受け取る変数のアドレス
    ofn.nMaxFile = sizeof(filename_full);  // lpstrFileに指定した変数のサイズ
    ofn.nMaxFileTitle = sizeof(filename);  // lpstrFileTitleに指定した変数のサイズ
    ofn.Flags = OFN_OVERWRITEPROMPT;        // フラグ指定
    ofn.lpstrTitle = L"名前を付けて保存"; // コモンダイアログのキャプション
    ofn.lpstrDefExt = L"txt";           // デフォルトのファイルの種類

    // 名前を付けて保存コモンダイアログを作成
    if( !GetSaveFileName( &ofn ) ){
     MessageBox( hWnd, L"エラー", L"エラー", MB_OK );
     SendMessage( hWnd, WM_CLOSE, 0, 0 );
     return 0;
    }
 
    // 選択されたファイル名を表示
    MessageBox( hWnd, filename_full, L"OK", MB_OK );
    break;
   case ID_EXIT:
     PostQuitMessage(0);
     break;
  }
  return 0;
 case WM_DESTROY:
  exit(0);
  break;
 default:
  if(WndProc){
   return CallWindowProc(WndProc,hWnd , msg , wParam , lParam);
  }else{
   return DefWindowProc(hWnd,msg,wParam,lParam);
  }
 }
}
 
//ウィンドウの検索
BOOL CALLBACK enumWindowsProc(HWND hWnd,LPARAM lParam){
 HANDLE hModule=(HANDLE)GetWindowLong(hWnd,GWL_HINSTANCE);
 if(GetModuleHandle(NULL)==hModule){
  wchar_t ClassName[256];
  GetClassNameW(hWnd,ClassName,sizeof(ClassName)/sizeof(ClassName[0]));
  if(wcsncmp(ClassName,L"FREEGLUT",wcslen(ClassName))==0){
   hWnd2=hWnd;
   return FALSE;
  }
 }
 return TRUE;
}
 
void display(void){
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glViewport(0, 0, width, height);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 
 gluPerspective(30.0, (double)width / (double)height, 1.0, 1000.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 
 gluLookAt(150.0,150.0,-150.0,
       0.0,0.0,0.0,
      0.0,1.0,0.0);
 
 glMaterialfv(GL_FRONT, GL_DIFFUSE, white);
 //回転
 glRotatef(anglex,1.0f,0.0f,0.0f);//X軸を回転
 glutSolidSphere(40.0,16,16);
 
 glutSwapBuffers();
}
void idle(void){
 anglex+=2.0f;
 Sleep(1);
 glutPostRedisplay();
}
void Init(){
 glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
 glEnable(GL_DEPTH_TEST);
 //ワイヤーフレーム
 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); 
}
bool main(int argc, char *argv[]){
 glutInit(&argc, argv);
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(width, height);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("ファイルセーブダイアログ");
 //FreeGlutのウインドウハンドルとウインドウプロシージャを置き換える
 EnumWindows(enumWindowsProc,0);
 if(hWnd2){
  WndProc=(WNDPROC)GetWindowLong(hWnd2,GWL_WNDPROC);
  SetWindowLong(hWnd2,GWL_WNDPROC,(LONG)WndProc2);
 }else{
  return false;
 }
 //メニューを作成
 hMenu=LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MENU1));
 if(hMenu){
  SetMenu(hWnd2,hMenu);
 }else{
  return false;
 }
 // コモンコントロール関係の初期化
 InitCommonControls();
 // ステータスバーを作成
 hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,
   L"メニューの「名前を付けて保存」を選択して下さい。",hWnd2,ID_STATUS);
 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return true;
}

 

 

 

 

 

最終更新:2014年05月13日 20:14
添付ファイル