1. 程式人生 > >一個極好的OpenGL漢字顯示類

一個極好的OpenGL漢字顯示類

{
    GLuint        PixelFormat;            
// 儲存查詢匹配的結果
    WNDCLASS    wc;                        // 視窗類結構
    DWORD        dwExStyle;                // 擴充套件視窗風格
    DWORD        dwStyle;                // 視窗風格
    RECT        WindowRect;                // 取得矩形的左上角和右下角的座標值
    WindowRect.left=(long)0;            // 將Left   設為 0

    WindowRect.right=(long)width;        // 將Right  設為要求的寬度
    WindowRect.top=(long)0;                // 將Top    設為 0
    WindowRect.bottom=(long)height;        // 將Bottom 設為要求的高度

    fullscreen
=fullscreenflag;            // 設定全域性全屏標誌

    hInstance            
= GetModuleHandle(NULL);                // 取得我們視窗的例項
    wc.style            
= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;    // 移動時重畫,併為視窗取得DC
    wc.lpfnWndProc        = (WNDPROC) WndProc;                    // WndProc處理訊息
    wc.cbClsExtra        =0;                                    // 無額外視窗資料
    wc.cbWndExtra        =0;                                    // 無額外視窗資料
    wc.hInstance        
= hInstance;                            // 設定例項
    wc.hIcon            = LoadIcon(NULL, IDI_WINLOGO);            // 裝入預設圖示
    wc.hCursor            = LoadCursor(NULL, IDC_ARROW);            // 裝入滑鼠指標
    wc.hbrBackground    = NULL;                                    // GL不需要背景
    wc.lpszMenuName        = NULL;                                    // 不需要選單
    wc.lpszClassName    ="OpenG";                                // 設定類名字

    
if (!RegisterClass(&wc))                                    // 嘗試註冊視窗類
{
        MessageBox(NULL,
"註冊視窗失敗","錯誤",MB_OK|MB_ICONEXCLAMATION);
        
return FALSE;                                    // 退出並返回FALSE
    }

    
    
if (fullscreen)                                            // 要嘗試全屏模式嗎?
{
        DEVMODE dmScreenSettings;                                
// 裝置模式
        memset(&dmScreenSettings,0,sizeof(dmScreenSettings));    // 確保記憶體清空為零
        dmScreenSettings.dmSize=sizeof(dmScreenSettings);        // Devmode 結構的大小
        dmScreenSettings.dmPelsWidth    = width;                // 所選螢幕寬度
        dmScreenSettings.dmPelsHeight    = height;                // 所選螢幕高度
        dmScreenSettings.dmBitsPerPel    = bits;                    // 每象素所選的色彩深度
        dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

        
// 嘗試設定顯示模式並返回結果。注: CDS_FULLSCREEN 移去了狀態條
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
        
{
            
// 若模式失敗,提供兩個選項:退出或在視窗內執行。
if (MessageBox(NULL,"全屏模式在當前顯示卡上設定失敗!使用視窗模式?","NeHe G",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
            
{
                
//如果使用者選擇視窗模式,變數fullscreen 的值變為FALSE,程式繼續執行
                fullscreen=FALSE;        // 選擇視窗模式(Fullscreen=FALSE)
            }

            
else
            
{
                
//如果使用者選擇退出,彈出訊息視窗告知使用者程式將結束。並返回FALSE告訴程式視窗未能成功建立。程式退出。
                MessageBox(NULL,"程式將被關閉","錯誤",MB_OK|MB_ICONSTOP);
                
return FALSE;                                    // 退出並返回 FALSE
            }

        }

    }


    
if (fullscreen)                                                // 仍處於全屏模式嗎?
{
        dwExStyle
=WS_EX_APPWINDOW;                                // 擴充套件窗體風格
        dwStyle=WS_POPUP;                                        // 窗體風格
        ShowCursor(FALSE);                                        // 隱藏滑鼠指標
    }

    
else
    
{
        dwExStyle
=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;            // 擴充套件窗體風格
        dwStyle=WS_OVERLAPPEDWINDOW;                            // 窗體風格
    }


    AdjustWindowRectEx(
&WindowRect, dwStyle, FALSE, dwExStyle);        // 調整視窗達到真正要求的大小

    
// 建立視窗
if (!(hWnd=CreateWindowEx(    dwExStyle,                            // 擴充套件窗體風格
"OpenG",                            // 類名字
                                title,                                // 視窗標題
                                dwStyle |// 必須的窗體風格屬性
                                WS_CLIPSIBLINGS |// 必須的窗體風格屬性
                                WS_CLIPCHILDREN,                    // 必須的窗體風格屬性
00,                                // 視窗位置
                                WindowRect.right-WindowRect.left,    // 計算調整好的視窗寬度
                                WindowRect.bottom-WindowRect.top,    // 計算調整好的視窗高度
                                NULL,                                // 無父視窗
                                NULL,                                // 無選單
                                hInstance,                            // 例項
                                NULL)))                                // 不向WM_CREATE傳遞任何東東
{
        KillGLWindow();                                
// 重置顯示區
        MessageBox(NULL,"視窗建立錯誤","錯誤",MB_OK|MB_ICONEXCLAMATION);
        
return FALSE;                                // 返回 FALSE
    }


    
static    PIXELFORMATDESCRIPTOR pfd=//pfd 告訴視窗我們所希望的東東,即視窗使用的畫素格式
{
        
sizeof(PIXELFORMATDESCRIPTOR),                // 上述格式描述符的大小
1,                                            // 版本號
        PFD_DRAW_TO_WINDOW |// 格式支援視窗
        PFD_SUPPORT_OPENGL |// 格式必須支援OpenGL
        PFD_DOUBLEBUFFER,                            // 必須支援雙緩衝
        PFD_TYPE_RGBA,                                // 申請 RGBA 格式
        bits,                                        // 選定色彩深度
000000,                            // 忽略的色彩位
0,                                            // 無Alpha快取
0,                                            // 忽略Shift Bit
0,                                            // 無累加快取
0000,                                    // 忽略聚集位
16,                                            // 16位 Z-快取 (深度快取) 
0,                                            // 無蒙板快取
0,                                            // 無輔助快取
        PFD_MAIN_PLANE,                                // 主繪圖層
0,                                            // 不使用重疊層
000// 忽略層遮罩
    }
;
    
    
if (!(hDC=GetDC(hWnd)))                            // 取得裝置描述表了麼?
{
        KillGLWindow();                                
// 重置顯示區
        MessageBox(NULL,"不能建立一個視窗裝置描述表","錯誤",MB_OK|MB_ICONEXCLAMATION);
        
return FALSE;                                // 返回 FALSE
    }


    
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))    // Windows 找到相應的象素格式了嗎?
{
        KillGLWindow();                                
// 重置顯示區

相關推薦

一個OpenGL漢字顯示

{    GLuint        PixelFormat;            // 儲存查詢匹配的結果    WNDCLASS    wc;                        // 視窗類結構    DWORD        dwExStyle;                // 擴充套

一個的GitHub開源Python專案: What the f*ck Python! snake

Python, being a beautifully designed high-level and interpreter-based programming language, provides us with many features for the programmer's comf

ABAP--一個的呼叫外部java程式的Search Help Exit的例項(RFC例子)

Connecting to an external source via Java Connector (By Bob Billings) In the process of SAP Order Entry (VA01) it became necess

一個封裝的執行緒

原文出處 class CThread { public: /**//** * Default Constructor */ CThread() {

PyCrypto —— 一個的資訊保安python庫

我在【win7作業系統 + 32位機器】上裝python2.7 和PyCrypto(也有64位的版本),用這個輔助學習,感覺挺方便的。 其他引用來源: Installing PyCrypto On Windows (Or How To Build Instal

分享一個特別的測試http協議的測試工具

二話不說,咱直接上程式碼!!!! public class TestPost {          private static final SimpleDateFormat format = new SimpleDateFormat("y

為大家提供一個的時間工具DateTime

此類的靈感來源於C# 雖然網上有什麼date4j,但是jar太糾結了,先給出原始碼,可以繼承到自己的util包中,作為一個資深程式設計師,我相信都有不少好的util工具類,我也希望經過此次分享,能帶動技術大牛們能分享出自己的好用的工具類。 先看原始碼 /* * 岸思科技

.NET:一個非常用的SQL資料庫處理

using System; using System.Collections.Generic; using System.Collections; using System.Collections.Specialized; using System.Runtime.Re

一個封裝的使用完成埠的socket通訊

//*********************************************************************************** //檔案說明:TSocket.h //功能: 檔案傳輸客戶端實現標頭檔案 //使用說明:使用TCP的I

自定義一個用的SwipeRefreshLayout(彈力拉伸效果詳解)(轉載)

dsc drag 常數 lane swipe loading 數據改變 高中數學 tca 轉自: 自定義一個更好用的SwipeRefreshLayout(彈力拉伸效果詳解) 前言 熟悉SwipeRefreshLayout的同學一定知道,SwipeRefreshLayout是

問題:combo只顯示一個選項,其他不顯示(調整框的高度即可。)

== .com idc 普通 內容 重新 運行 padding href 解決辦法:調整框的高度即可。 轉自:http://blog.163.com/strive_only/blog/static/89380168200971010114665/ 雖然我也是用了好一段VC的

窗體顯示

mes tracking 變量 內存 raw win32 void gets mds 窗體在前面已經註冊。而且已經創建出來了,但這時這個窗體並不能出如今我們的眼前,又是什麽原因呢?哦,還不顯示出來,原來是有原因的,就是窗體有多種狀態。窗體能夠隱藏、普通顯示、最大化顯示、最

用C++設計一個不能被繼承的(轉)

它的 設計 指定 基於 構造 重寫 rtu 構造函數、析構函數 析構函數 在Java 中定義了關鍵字final,被final修飾的類不能被繼承。 首先想到的是在C++中,子類的構造函數會自動調用父類的構造函數。同樣,子類的析構函數也會自動調用父類的析構函數。要想一個類不能

一個字符串(string型)轉換成一個int

string_to_inint CommString::str_to_int(const std::string &str){ int ivalue = 0; sscanf(str.c_str(), "%d", &ivalue); return ivalue;}本文出自 “簡單可

C#之隱式與顯示型轉換

console program double 64位 大於 編譯器 line 成功 定義 今天在看一篇有關數據類型的文章的時候,無意間看到了兩個關鍵詞,“隱式轉換”與“顯示轉換”,然後突然想起了當初開始學編程的時候,也總是在代碼編譯的時候遇到這樣的問題。 那麽,今天剛好有空

搜藏一個php文件上傳

cti fault bre 單元素 出錯 構造 php文件 tmp log <?php /** * 上傳文件類 * @param _path : 服務器文件存放路徑 * @param _allowType : 允許上傳的文件類型和所對應的MIME * @pa

gcc和MinGW的異同(在cygwin/gcc做的東西可以無縫的用在linux下,沒有任何問題,是在windows下開發linux程序的一個的選擇)

實現 o-c tool 交叉 lin 分析 模擬 gcc編譯器 還要 cygwin/gcc和MinGW都是gcc在windows下的編譯環境,但是它們有什麽區別,在實際工作中如何選擇這兩種編譯器。 cygwin/gcc完全可以和在linux下的gcc化做等號,這個可以從bo

git學習之---如何把一個的項目傳到GitHub上

ide 如果 根目錄 裏的 keygen settings comm onf master 一、首先生成本地的ssh key 在命令窗口執行以下命令 ssh-keygen -t rsa -C "[email protected]" 執行後會提示你ssh key

建立一個漂亮的PHP驗證碼文件及調用方式

去掉 -1 cti elephant orm random 上一個 ott 狀態 //驗證碼類class ValidateCode { private $charset = ‘abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ2345678

Python--33 像一個客去思考

similar ecif baseline style 一個 trying arguments between mman Python自帶電池   電池:Python標準庫   PyThon標準庫中包含一般任務所需要的模塊   Python documentation ti