ページャーコントロールを表示する

ページャーコントロールです。
他のコントロールに押し込まれて隠れているコントロールを
スクロールするための物です。

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_BUTTON 109
#define ID_EDIT 110
#define ID_COOL 111

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")
#define _WIN32_WINNT 0x0501
#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 hRebar;       // レバーコントロールのハンドル
HWND hEdit;  //エディットボックスのハンドル
HWND hBut,hPager;
#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){
  LPNMHDR lpnmhdr;
  NMPGCALCSIZE *lpCalcSize;
  NMPGSCROLL *lpScroll;
  switch( msg ){
   case WM_SETCURSOR:
    return DefWindowProc(hWnd,msg,wParam,lParam);
   case WM_SIZE:
    SendMessage(hRebar, WM_SIZE, wParam, lParam);
    SendMessage( hStatusbar, WM_SIZE, wParam, lParam );
    return 0;
  case WM_COMMAND:
   switch (LOWORD(wParam)){
    case ID_EXIT:
     PostQuitMessage(0);
    }
    return 0;
  case WM_NOTIFY:
    lpnmhdr = (LPNMHDR)lParam;
      if (lpnmhdr->hwndFrom == hRebar) {
          if (lpnmhdr->code == RBN_HEIGHTCHANGE) {
              InvalidateRect(hWnd, NULL, TRUE);
              UpdateWindow(hRebar);
          }
      }
      if (lpnmhdr->hwndFrom == hPager) {
    switch (lpnmhdr->code) {
        case PGN_CALCSIZE:
            lpCalcSize = (LPNMPGCALCSIZE)lParam;
            if (lpCalcSize->dwFlag == PGF_CALCWIDTH) {
                lpCalcSize->iWidth = 80;
                }
                break;
        case PGN_SCROLL:
            lpScroll = (LPNMPGSCROLL)lParam;
            lpScroll->iScroll = 5;
            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);
}
static void AddSampleData(HWND hwnd){
    static wchar_t *data[]={L"DATA01",L"DATA02",L"DATA03",L"DATA04",L"DATA05",
                             L"DATA06",L"DATA07",L"DATA08",L"DATA09",L"DATA10",
                             L"DATA11",L"DATA12",L"DATA13",L"DATA14",L"DATA15",
                             L"DATA16",L"DATA17",L"DATA18",L"DATA19",L"DATA20",};
    for(int i=0;i<20;i++)SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)data[i]);
}
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);

 RECT Rect;                // RECT構造体
 INITCOMMONCONTROLSEX ic;  // INITCOMMONCONTROLSEX構造体
 REBARBANDINFO rbBand;     // REBARBANDINFO構造体
 //コモンコントロールの初期化
 ic.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES | ICC_PAGESCROLLER_CLASS;
 ic.dwSize = sizeof(INITCOMMONCONTROLSEX);
 InitCommonControlsEx(&ic);

 //レバーコントロールの作成
 hRebar = CreateWindowEx(0,REBARCLASSNAME,L"",
  WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | RBS_BANDBORDERS |
  WS_CLIPCHILDREN | CCS_NODIVIDER,
  0, 0, 0, 0,hWnd2, (HMENU)ID_COOL,
  (HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE), NULL);

 // REBARBANDINFO構造体
 ZeroMemory(&rbBand, sizeof(REBARBANDINFO));
 // 構造体のサイズ
 rbBand.cbSize = sizeof(REBARBANDINFO);
 // マスクフラグ
 rbBand.fMask = RBBIM_TEXT | RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE;
 // バンドのスタイルフラグ
 rbBand.fStyle = RBBS_CHILDEDGE; 
 // 最小値の高さ
 rbBand.cyMinChild = 40;
 // 最小値の幅
 rbBand.cxMinChild = 25;

             hPager = CreateWindowEx(0,
                WC_PAGESCROLLER,
                NULL,
                WS_CHILD | WS_VISIBLE | PGS_HORZ,
                0, 0,
                0, 0,
                hRebar,
                NULL,
                (HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE),
                NULL);

 // レバーコントロールにのせる対象の子ウインドウのハンドル
 hBut = CreateWindowEx(0, L"BUTTON", L"押すな~!!",
  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  0, 0, 0, 0, hPager, (HMENU)ID_BUTTON,
  (HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE) ,NULL);
 // レバーコントロールにボタンを挿入
 SendMessage(hPager, PGM_SETCHILD, 0, (LPARAM)hBut);
             rbBand.lpText = L"ボタン";
            rbBand.hwndChild = hPager;
            rbBand.cx = 100;
 SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);

 rbBand.lpText = L"コンボボックス";
 rbBand.hwndChild= hEdit = CreateWindow(L"EDIT",L"書き込むな~!!",
  WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE,
  0,0,0,0,hRebar,(HMENU)ID_EDIT,
  (HINSTANCE)GetWindowLong(hWnd2, GWL_HINSTANCE),NULL);
       
 GetClientRect(hRebar, &Rect);
 rbBand.cx = Rect.right - 100;
 //レバーコントロールにエディットボックスを挿入
 SendMessage(hRebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);

 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return true;
}

 

 

 

 

 

最終更新:2014年06月14日 15:02
添付ファイル