Openglとwin32apiについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
puchimilk
記事: 20
登録日時: 5年前

Openglとwin32apiについて

#1

投稿記事 by puchimilk » 5年前

Openglプログラミングメモというサイトに載っているコードをコピーして実行してみたのですが、続行するにはキーを押してくださいとしかでません。このコードはメニューバーとワイヤーフレームが表示されるらしいのですが続行するにはキーを押してくださいしか出ませんなぜでしょうか。
cppファイル

コード:

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

//FreeGlutのウインドウプロシージャを置き換える為の変数
WNDPROC WndProc=NULL; //元のウィンドウプロシージャ
HWND hWnd2=NULL; //ウィンドウハンドル
HMENU hMenu=NULL; //メニュー
 
//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:
     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;
 }
 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return true;
}
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

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

うずら

Re: Openglとwin32apiについて

#2

投稿記事 by うずら » 5年前

88行目のところにmain関数があるんですが・・・

Win32アプリケーションではWinMain関数を使うことになってます

コード:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: Openglとwin32apiについて

#3

投稿記事 by へにっくす » 5年前

出典元ぐらい書いてください。
ここですね。
OpenGLプログラミングメモ - メニューを表示する

なぜmain.cppにある最初の、

コード:

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
はないのでしょうか?
written by へにっくす

閉鎖

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