約 5,277,158 件
https://w.atwiki.jp/daiseisenbura/pages/27.html
ボタン類が並んでいるエリアを右クリックして "メニュー"にチェックを入れれば、メニューバーが表示されます。 画面の表示方法を切り替える(スレッド一覧とスレッドを同時に表示する)へ戻る 板が開けないときに板一覧を更新するへ進む
https://w.atwiki.jp/opengl/pages/68.html
JPEG画像を読み込んで表示します。 フルカラーとグレースケールのみサポートしています。 かなりデータサイズを小さくできるので広く使われています。http //www.ijg.org/こちらのサイトでフリーのJPEGライブラリのソースコードが配布されています。 libjpeg.lib を作成してください。作り方はgoogleなどで検索して作って下さい。 jpeglib.h , jconfig.h , jmorecfg.h , libjpeg.lib をプロジェクトのフォルダに設置して下さい。 これでJPEGを読み込む準備が整いました。 ファイル main.cpp jpeglib.h (配布先サイトから入手して下さい) jconfig.h (配布先サイトから入手して下さい) jmorecfg.h (配布先サイトから入手して下さい) libjpeg.lib (自分で作成して下さい) sample.jpg main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, libjpeg.lib ) #include GL/freeglut/freeglut.h #include stdio.h #include jpeglib.h #define WIDTH 320 #define HEIGHT 240 class JPEG { public JSAMPARRAY img; struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; unsigned long sizeX; //横 unsigned long sizeY; //縦 char *Data; //画像データ格納 bool Load(char *filename); GLuint texture; void TexSet(); JPEG(char *FileName); }; JPEG JPEG(char *FileName){ cinfo.err = jpeg_std_error( jerr ); jpeg_create_decompress( cinfo ); Load(FileName); TexSet(); } bool JPEG Load(char *FileName) { FILE *File; if ((File = fopen(FileName, rb ))==NULL){ printf( ファイルがありません ); return false; } jpeg_stdio_src( cinfo, File ); jpeg_read_header( cinfo, TRUE ); sizeX=cinfo.image_width; sizeY=cinfo.image_height; jpeg_start_decompress( cinfo ); // イメージを保持するメモリ領域の確保と初期化 Data = (char *) malloc(sizeY*(sizeX*3)); img = (JSAMPARRAY)malloc( sizeof( JSAMPROW ) * cinfo.image_height ); for ( int i = 0; (unsigned)i cinfo.image_height; i++ ) { img[i] = (JSAMPROW)calloc( sizeof( JSAMPLE ), 3 * cinfo.image_width ); } // 全イメージデータを取得 while( cinfo.output_scanline cinfo.output_height ) { jpeg_read_scanlines( cinfo,img + cinfo.output_scanline,cinfo.output_height - cinfo.output_scanline ); } for(int i=0;(unsigned)i sizeY;i++){ for(int j=0;(unsigned)j sizeX*3;j++){ Data[i*sizeX*3+j] = (char)img[sizeY-i-1][j]; } } jpeg_finish_decompress( cinfo ); jpeg_destroy_decompress( cinfo ); fclose( File ); // イメージデータを保持するメモリ領域を開放 for ( int i = 0; (unsigned)i sizeY; i++ ) free( img[i] ); free( img ); return true; } void JPEG TexSet() { glEnable( GL_TEXTURE_2D ); glGenTextures( 1, texture ); glBindTexture( GL_TEXTURE_2D, texture ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexImage2D( GL_TEXTURE_2D, 0, 3, sizeX, sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Data ); glBindTexture( GL_TEXTURE_2D, 0 ); } JPEG *jpeg; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glOrtho(0.0, WIDTH, HEIGHT, 0.0, -1.0, 1.0); glEnable(GL_TEXTURE_2D);//テクスチャ有効 glBindTexture( GL_TEXTURE_2D, jpeg- texture ); glEnable(GL_ALPHA_TEST);//アルファテスト開始 glBegin(GL_POLYGON); glTexCoord2f(0.0f, 0.0f); glVertex2d(10 , 230);//左下 glTexCoord2f(0.0f, 1.0f); glVertex2d(10 , 10);//左上 glTexCoord2f(1.0f, 1.0f); glVertex2d( 310 , 10);//右上 glTexCoord2f(1.0f, 0.0f); glVertex2d( 310 , 230);//右下 glEnd(); glDisable(GL_ALPHA_TEST);//アルファテスト終了 glDisable(GL_TEXTURE_2D);//テクスチャ無効 glutSwapBuffers(); } void idle(void) { glutPostRedisplay(); } void Init(){ glClearColor(0.0, 0.0, 0.0, 1.0); glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); jpeg = new JPEG( sample.jpg ); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( JPEG画像を読み込んで表示 ); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/gekitotsu/pages/146.html
× × × 戻る× × ×名要塞メニュー× × × 部分編集機能と#include(○○○)を利用して、見たい番号の名要塞を表示するページです。 × × × 使い方 × × × まず右下にある「部分編集」をクリック。 #include(oooo)のoの部分に見たい要塞の番号を入力。保存。これで終了。 以前使った人の番号が残っているかもしれないが 書き換えてよし。ただし、10件までしか表示されないので注意。 [部分編集] 00008Ay0fePpj00000p00008o00000t002Ft400000t002Fra0082TF0bPTW300000p00000a0000ht002Fvp00000o0001sa0005Rj0000ekjnf0a8a00001 000e3Vp01AyGo0aoAXo01Ay9p004jaodqwoJodhJSkE05NhBEpVNyop010lmE05plEp01p5uE pW302X00MFLS00M8r6mk8kdP6qSarp00MFMp01qDfv00QLa × × ×上へ× × ×戻る× × ×名要塞メニュー× × ×
https://w.atwiki.jp/opengl/pages/26.html
先の『画像を表示する(GDI+)』では GDI+ を使いましたが、 GdiPlus.h を見ると struct IDirectDrawSurface7; なる表記があります。 内部で DirectX7 を使用しているようです。 OpenGLなのにDirectXは使いたくない!!とか、 WindowsじゃないOSで画像を読み込みたい!!という方のために glpng を 使った方法も記載しておきます。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include stdio.h #include gl/glpng.h #define WIDTH 320 #define HEIGHT 240 pngInfo info; GLuint texture; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glOrtho(0.0, WIDTH, HEIGHT, 0.0, -1.0, 1.0); glEnable(GL_TEXTURE_2D);//テクスチャ有効 glEnable(GL_ALPHA_TEST);//アルファテスト開始 glBegin(GL_POLYGON); glTexCoord2f(0.0f, 1.0f); glVertex2d(10 , 230);//左下 glTexCoord2f(0.0f, 0.0f); glVertex2d(10 , 10);//左上 glTexCoord2f(1.0f, 0.0f); glVertex2d( 310 , 10);//右上 glTexCoord2f(1.0f, 1.0f); glVertex2d( 310 , 230);//右下 glEnd(); glDisable(GL_ALPHA_TEST);//アルファテスト終了 glDisable(GL_TEXTURE_2D);//テクスチャ無効 glutSwapBuffers(); } void idle(void) { glutPostRedisplay(); } void Init(){ glClearColor(0.0, 0.0, 0.0, 1.0); glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); texture = pngBind ( sample.png , PNG_NOMIPMAP, PNG_ALPHA, info, GL_CLAMP, GL_NEAREST, GL_NEAREST); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutCreateWindow( 画像を読み込んで表示 ); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/gameguru/pages/21.html
テキストやパネルを表示する この記事で日本語は表示できないという話を書きましたが誤りでした。 日本語の入ったビットマップフォントを用意すれば日本語も表示できます。 Text(x, y, fontsize, s) x = X座標(パーセント指定) y = Y座標(パーセント指定) fontsize = フォントサイズ(1~3のいずれか) s = 表示したいテキスト この関数で任意の箇所にテキストを表示できます。 日本語には対応していないので、英数字しか表示できませんが、デバッグ時などに役立つでしょう。 例えば、主人公の現在座標を表示したりね。 X座標やY座標の値がパーセント指定なのは、3Dゲームでは解像度を変更することが出来るためです。 慣れるまでは設定がやや面倒です。 Panel(x, y, x2, y2) x = パネル開始位置のX座標(パーセント指定) y = パネル開始位置のY座標(パーセント指定) x2 = パネル終了位置のX座標(パーセント指定) y2 = パネル終了位置のY座標(パーセント指定) 半透明の四角いパネルを画面上に描画します。 テキストと合わせて表示すると、RPGやギャルゲーみたいなメッセージウィンドウみたいになります。 まぁ日本語には対応していないんですけどね。 テキストをただ表示するよりも、後ろにパネルを置いた方が見やすくなっていいですね。 デバッグに活用してください。
https://w.atwiki.jp/opengl/pages/199.html
トラックバーです。 範囲選択とかもできますが説明は省きます。 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_TRACK 109 #define ID_STATIC 110 menu.rc #include resource.h IDR_MENU1 MENU BEGIN POPUP File BEGIN 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 GL/freeglut/freeglut.h #include resource.h #include commctrl.h //CreateStatusWindow()のために必要 //FreeGlutのウインドウプロシージャを置き換える為の変数 WNDPROC WndProc=NULL; //元のウィンドウプロシージャ HWND hWnd2=NULL; //ウィンドウハンドル HMENU hMenu=NULL; //メニュー HWND hStatusbar; // ステータスバーのハンドル HWND hTrack;//トラックバーのハンドル HWND hStatic;//スタティックテキストのハンドル #define WIDTH 320 #define 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){ switch( msg ){ case WM_SIZE SendMessage( hStatusbar, WM_SIZE, wParam, lParam ); return 0; case WM_COMMAND switch (LOWORD(wParam)){ case ID_EXIT PostQuitMessage(0); } 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); wchar_t Range[255]; DWORD Pos = SendMessage(hTrack, TBM_GETPOS, 0, 0); wsprintf(Range, L %d , Pos); SetWindowText(hStatic, Range); 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[]){ glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); 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); hTrack = CreateWindowEx(0,TRACKBAR_CLASS, L , WS_CHILD | WS_VISIBLE |TBS_AUTOTICKS | TBS_ENABLESELRANGE,//ウィンドウスタイル 10, 10, 150, 30,//位置、大きさ hWnd2,(HMENU)ID_TRACK,(HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE),NULL); //トラックバーの範囲設定 SendMessage(hTrack, TBM_SETRANGE, (WPARAM)TRUE, (LPARAM)MAKELPARAM(0, 10)); hStatic = CreateWindow(L STATIC ,L 0 , WS_CHILD|WS_VISIBLE|SS_LEFT, 170,10,50,20,hWnd2,(HMENU)ID_STATIC,(HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE), NULL); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return true; }
https://w.atwiki.jp/schofeshome/pages/26.html
レイアウト→+ADD→リッチテキスト→高度なテキスト編集 #C0TITLE# ←これ入力で最初の予定表示 #C1TITLE# ←これは2番目の予定表示 ※Googleカレンダーのみ対応
https://w.atwiki.jp/opengl/pages/163.html
ラジオボタンです。 チェックできるのは1つだけです。 resource.h #define IDR_MENU1 100 #define ID_EXIT 101 #define ID_RADIO1 104 #define ID_RADIO2 105 #define ID_RADIO3 106 #define ID_Help 107 #define ID_STATUS 108 #define IDM_END 114 #define ID_OPTION 115 menu.rc #include windows.h #include resource.h IDR_MENU1 MENU BEGIN POPUP File BEGIN MENUITEM Exit , ID_EXIT END MENUITEM Option ID_OPTION MENUITEM ヘルプ , ID_Help END main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, comctl32.lib ) #include GL/freeglut/freeglut.h #include resource.h #include commctrl.h //CreateStatusWindow()のために必要 //FreeGlutのウインドウプロシージャを置き換える為の変数 WNDPROC WndProc=NULL; //元のウィンドウプロシージャ HWND hWnd2=NULL; //ウィンドウハンドル HMENU hMenu=NULL; //メニュー HWND hStatusbar; // ステータスバーのハンドル HINSTANCE hInstance; //インスタンスハンドル #define WIDTH 320 #define HEIGHT 240 //回転用 float anglex = 0.0f; //白 GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; //置き換えた後のプロシージャ LRESULT CALLBACK WndProc2(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ static RECT rcDisp; switch (msg) { case WM_CREATE // コモンコントロールの初期化 InitCommonControls(); break; case WM_COMMAND switch(LOWORD(wp)) { case ID_EXIT PostQuitMessage(0); break; } break; case WM_SIZE GetClientRect(hWnd, rcDisp); SendMessage( hStatusbar, WM_SIZE, wp, lp ); break; case WM_DESTROY exit(0); break; default if(WndProc){ return CallWindowProc(WndProc,hWnd , msg , wp , lp); }else{ return DefWindowProc(hWnd,msg,wp,lp); } } return 0; } //ウィンドウの検索 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[]){ glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); 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; } // ステータスバーを作成 hStatusbar = CreateStatusWindowW(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP, L ステータスバー ,hWnd2,ID_STATUS); HINSTANCE hInst = (HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE); HWND hRadio1 = CreateWindow(L BUTTON ,L 選択肢1 ,WS_CHILD|WS_VISIBLE|WS_GROUP|BS_AUTORADIOBUTTON, 0,20,90,30,hWnd2,(HMENU)ID_RADIO1,hInst,NULL); HWND hRadio2 = CreateWindow(L BUTTON ,L 選択肢2 ,WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 0,50,90,30,hWnd2,(HMENU)ID_RADIO2,hInst,NULL); HWND hRadio3 = CreateWindow(L BUTTON ,L 選択肢3 ,WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 0,80,90,30,hWnd2,(HMENU)ID_RADIO3,hInst,NULL); SendDlgItemMessage(hWnd2,ID_RADIO1,BM_SETCHECK,BST_CHECKED,0);//選択肢1にセット glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return true; }
https://w.atwiki.jp/opengl/pages/109.html
前回と同様にしてステータスバーを表示してみました。 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 menu.rc #include resource.h IDR_MENU1 MENU BEGIN POPUP File BEGIN 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 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){ switch( msg ){ case WM_SIZE SendMessage( hStatusbar, WM_SIZE, wParam, lParam ); return 0; case WM_COMMAND switch (LOWORD(wParam)){ case ID_EXIT PostQuitMessage(0); } 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; }
https://w.atwiki.jp/opengl/pages/200.html
ツールチップです。一定時間ツールバーの上でマウスカーソルを停止すると現れます。 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_TOOLBAR 109 #define IDM_NEW 1010 #define IDM_OPEN 1020 #define IDM_SAVE 1030 #define IDM_COPY 1040 #define IDM_PASTE 1050 #define IDM_DELETE 1060 #define IDM_CUT 1070 #define IDM_FIND 1080 #define IDM_HELP 1090 #define IDM_DETAILS 1100 #define IDM_PRINT 1110 #define IDM_REDOW 1120 #define IDM_REPLACE 1130 menu.rc #include resource.h IDR_MENU1 MENU BEGIN POPUP File BEGIN 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 STRINGTABLE DISCARDABLE BEGIN IDM_COPY コピーします IDM_DELETE 削除します IDM_CUT 切り取ります IDM_NEW 新規ファイル作成 IDM_OPEN ファイルをオープンします IDM_SAVE 保存します IDM_FIND 検索をします IDM_HELP ヘルプです IDM_PASTE 貼り付け IDM_DETAILS 詳細表示 IDM_PRINT 印刷をします IDM_REDOW 元に戻します IDM_REPLACE 置き換え END main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, comctl32.lib ) #include GL/freeglut/freeglut.h #include resource.h #include commctrl.h //CreateStatusWindow()のために必要 //FreeGlutのウインドウプロシージャを置き換える為の変数 WNDPROC WndProc=NULL; //元のウィンドウプロシージャ HWND hWnd2=NULL; //ウィンドウハンドル HMENU hMenu=NULL; //メニュー HWND hStatusbar; // ステータスバーのハンドル HWND hToolbar; //ツールバーのハンドル TBBUTTON tbb[] = { {STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_COPY, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_CUT, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_DELETE, IDM_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_FIND, IDM_FIND, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_HELP, IDM_HELP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_PASTE, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_PRINT, IDM_PRINT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_REDOW, IDM_REDOW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_REPLACE, IDM_REPLACE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {VIEW_DETAILS, IDM_DETAILS, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0} }; #define WIDTH 320 #define 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){ switch( msg ){ case WM_SIZE SendMessage( hStatusbar, WM_SIZE, wParam, lParam ); SendMessage(hToolbar , msg , wParam , lParam); return 0; case WM_COMMAND switch (LOWORD(wParam)){ case ID_EXIT PostQuitMessage(0); } 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); } HWND CreateToolWnd(HWND hWnd){ HWND hTool, hToolTip; static TBADDBITMAP tbab; static TOOLINFO ti; static int stdid, id; // ツールバーを作る hTool = CreateToolbarEx( hWnd, WS_CHILD | WS_VISIBLE, ID_TOOLBAR, 12, (HINSTANCE)HINST_COMMCTRL, IDB_STD_SMALL_COLOR, (LPCTBBUTTON)tbb, 12, 0, 0, 0, 0, sizeof(TBBUTTON)); tbab.hInst = HINST_COMMCTRL; tbab.nID = IDB_VIEW_SMALL_COLOR; stdid = SendMessage(hTool, TB_ADDBITMAP, 1, (LPARAM) tbab); for (id = 12; id = 12; id++) { tbb[id].iBitmap += stdid; } SendMessage(hTool, TB_ADDBUTTONS, 1, (LPARAM) tbb[12]); SendMessage(hTool, TB_AUTOSIZE, 0, 0); // ツールチップを作る hToolTip = CreateWindowEx( 0, //拡張ウィンドウスタイル TOOLTIPS_CLASS, //クラスネーム NULL, //ウィンドウネーム TTS_ALWAYSTIP, // ウィンドウスタイル CW_USEDEFAULT, // X座標 CW_USEDEFAULT, // Y座標 CW_USEDEFAULT, // 幅 CW_USEDEFAULT, // 高さ hWnd, // 親ウィンドウのハンドル NULL, // メニューハンドル (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), // インスタンスハンドル NULL); // WM_CREATEデータ ti.cbSize = TTTOOLINFOW_V1_SIZE; ti.hwnd = hTool; ti.hinst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); ti.uFlags = TTF_SUBCLASS; for (id = 0; id = 12; id++) { SendMessage(hTool, TB_GETITEMRECT, id, (LPARAM) ti.rect); ti.uId = tbb[id].idCommand; ti.lpszText = (LPTSTR)tbb[id].idCommand; SendMessage(hToolTip, TTM_ADDTOOL, 0, (LPARAM) ti); } SendMessage(hTool, TB_SETTOOLTIPS, (WPARAM)hToolTip, 0); return hTool; } bool main(int argc, char *argv[]){ glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); 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); TBBUTTON tbutton[] = { {STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0}, {STD_COPY, IDM_COPY, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_PASTE, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_DELETE, IDM_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0}, {STD_CUT, IDM_CUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, 0} }; hToolbar = CreateToolWnd(hWnd2); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return true; }