windows程式設計讀書筆記一
用VC MFC有一段時間了,總覺得還沒掌握到精髓,專案程式碼基本是拼湊起來的。總是少點什麼。前段時間,看完 快樂鸚鵡 的程式人生, 裡面提到 全域性變數 的一段。突然想到自己用 vc+opencv的一個小專案, 那裡面真可謂 全域性變數滿天飛啊,只要是mat 的變數都成了全域性變數,方便訪問。總覺得自己以前寫程式,純屬為寫而寫, 只要能達到目標,怎麼直接怎麼來,很是野蠻的方式。對寫程式缺乏一個系統的研究,基礎不牢固。很有必要,系統的看看相關書籍了。
1、註冊視窗類時,類的名稱不能重複,當前面已經註冊了一個名字的類(lpszClassName),後面的視窗類就不能再用這個名字了。
以下程式碼用 szAppName[] 及szAppName1[] 放置兩個類名字串,若szAppName1[] 的內容與szAppName[]一樣時,在第二次註冊時不會成功,由GetLastError()的返回值是1410 可以到 〖1410〗-類別已存在。
#include <windows.h> #include <tchar.h> #include <mmsystem.h> #pragma comment(lib, "WINMM.LIB") LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("HelloWin") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; static TCHAR szAppName1[] = TEXT("HelloWin"); HWND hwnd1; WNDCLASS wndclass1; wndclass1.style = CS_HREDRAW | CS_VREDRAW; wndclass1.lpfnWndProc = WndProc; wndclass1.cbClsExtra = 0; wndclass1.cbWndExtra = 0; wndclass1.hInstance = hInstance; wndclass1.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass1.hCursor = LoadCursor(NULL, IDC_WAIT); wndclass1.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wndclass1.lpszMenuName = NULL; wndclass1.lpszClassName = szAppName1; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } if (!RegisterClass(&wndclass1)) { GetLastError(); MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName1, MB_ICONERROR); return 0; } hwnd = CreateWindow (szAppName, // window class name TEXT ("The Hello Program"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL) ; // creation parameters ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; hwnd1 = CreateWindow(szAppName1, // window class name TEXT("The Hello Program1"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL); // creation parameters ShowWindow(hwnd1, iCmdShow); UpdateWindow(hwnd1); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (message) { case WM_CREATE: PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; TextOut(hdc, 0, 0, _T("您好!測試一下數量"), 9); DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; case WM_LBUTTONDOWN: PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC); return 0; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
2、上述程式TextOut(hdc,0,0,_T("您好!測試下數量"),9) 針對函式TextOut的試驗。
a、TextOut並不認為字串尾部值為0位元組表示字串的結束,它利用iLength引數來決定字串的長度,把9該大時將會出現亂碼
b、去掉_T() ,也是出現亂碼, unicode雙位元組字串。
c、確定列印個數時,可以使用 lstrlen() 獲得;
3、訊息中處理的變數,若是有連續性或其他地方需要使用,該變數應宣告為靜態變數。因為訊息結束時,訊息中的變數也會隨之釋放,將上面的回撥函式改為:
分別點選滑鼠左鍵和右鍵能清楚的看到 區域性變數 和全域性變數的影響。LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; TCHAR szAppName[] = TEXT("大王叫我來尋山!"); static int lButtonDownTimes = 0; int rButtonDownTimes = 0; static TCHAR timesDown[100]; static TCHAR timesRDown[100]; switch (message) { case WM_CREATE: PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; TextOut(hdc, 0, 0, timesDown, 10); TextOut(hdc, 0, 10, timesRDown, 10); DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; case WM_LBUTTONDOWN: wsprintf(timesDown, _T("左鍵按下次數:%d"), lButtonDownTimes); InvalidateRect(hwnd,NULL,TRUE); lButtonDownTimes++; return 0; case WM_RBUTTONDOWN: wsprintf(timesRDown, _T("右鍵按下次數:%d"), rButtonDownTimes); InvalidateRect(hwnd, NULL, TRUE); rButtonDownTimes++; return 0; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
上述函式在滑鼠點選的訊息內,呼叫了 InvalidateRect(hwnd,NULL,TRUE)使得整個視窗無效,InvalidateRect函式會生成WM_PAINT訊息。
關於第5章P107對 TextOut的使用
TextOut (hdc, 14*cxCaps+35*cxChar, cyChar*i, szBuffer,
wsprintf (szBuffer, TEXT ("%5d"),GetDeviceCaps (hdc, devcaps[i].iIndex))) ;
wsprintf 函式的返回值就是字串的長度。相關推薦
windows程式設計讀書筆記一
用VC MFC有一段時間了,總覺得還沒掌握到精髓,專案程式碼基本是拼湊起來的。總是少點什麼。前段時間,看完 快樂鸚鵡 的程式人生, 裡面提到 全域性變數 的一段。突然想到自己用 vc+opencv的一個小專案, 那裡面真可謂 全域性變數滿天飛啊,只要是mat 的變數都成了全
windows程式設計讀書筆記之練習一
看完第5章,突然想寫一個類cad的程式,先做簡單功能描述及可能用到的函式 1、畫直線,線寬、線形可以設定,滑鼠左鍵開始繪圖,滑鼠移動時,跟蹤滑鼠繪製直線,再次左鍵,直線繪製完畢,同時開始繪製下一直線,右鍵結束直線繪製。線形線寬在開始繪圖時設定。 2、滑鼠滾動,放大 縮小,
windows程式設計讀書筆記四
前面的程式碰到重新整理時碰到閃爍問題,百度一搜,一堆關於雙緩衝解決閃爍的文章。 具體實施方案為: 1、建立一個記憶體DC hdcMem = CreateCompatibleDC(hdc); 此時,記憶體DC的顯示錶面是單色、1個畫素寬、1個畫素高。即顯示錶面僅
windows程式設計讀書筆記--------資源
windows使用資源的一個好處是能夠統一的進行管理,把所有的資源都繫結到程式的.EXE檔案中。如果沒有資源的概念的話,資源不得不單獨的作為一個檔案來儲存,並在使用的時候將其讀入記憶體。windows程式設計中,主要有如下一些資源:圖示,滑鼠指標,字串,自定義資源,選單,
windows程式設計讀書筆記三
我想我知道為什麼CAD軟體中,當滑鼠移動很快時,影象會跟不上了。 滑鼠移經視窗的客戶區時,Windows系統不會為滑鼠經過的每個象素位置都產生WM_MOUSEMOVE訊息。程式收到的WM_MOUSEMOVE訊息個數取決於滑鼠硬體和視窗過程處理滑鼠移動的速度。換言之,如果訊息
windows程式設計讀書筆記二
一、繪圖基礎這一章強調最多的莫過於 資源的取得 及 釋放 1、希望在圖形輸出裝置上繪製圖形,必須首先獲取裝置環境(DC)的控制代碼。在GDI函式中這個控制代碼作為一個引數,告訴windows在哪個裝置上進行繪圖。對裝置的使用完畢時,必須釋放該控制代碼。 a、如果在處理一條訊
實戰java高併發程式設計讀書筆記一
基本概念 同步非同步 同步和非同步這兩個是相對的概念用來描述方法的呼叫。同步指的是方法呼叫開始方法的呼叫者必須等待方法呼叫返回時,才能進行下一步操作。而相對的概念非同步就是相反,呼叫者不需要進行等待。 併發並行 併發和並行兩個概念特別的容易混淆,他們都表示兩個以
python高階程式設計讀書筆記(一)
python高階程式設計讀書筆記(一) python 高階程式設計讀書筆記,記錄一下基礎和高階用法 python2和python3相容處理 使用sys模組使程式python2和python3相容 import sysver=sys.version_info#(ma
java程式設計思想讀書筆記一(面向物件)
面向物件 我們常見的程式設計正規化有指令式程式設計,函數語言程式設計,邏輯式程式設計,而面向物件程式設計也是一種指令式程式設計。 指令式程式設計式面向計算機硬體的一種抽象,有變數(儲存單元),賦值語句(獲取儲存指令),表示式(記憶體引用和算術運算)和控制語句(跳轉指令),命令式程
Java併發程式設計讀書筆記(一)
前幾天整理電腦檔案的時候,突然發現了之前還在kindle儲存了關於併發程式設計的書,剛好自己在這方面挺薄弱的,故整理一波讀書筆記,繼續加強學習。 1.上下文切換 1.1 時間片分配演算法 時間片是CPU分配給各個執行緒的時間,CPU通過不停地切換執行緒執行,使各個執行緒彷彿是”同
Javascript高階程式設計--讀書筆記之面向物件(一)
哈哈哈萬物皆物件,終於到了js的面向物件篇。 一、屬性型別 (1)資料屬性 資料屬性包含一個數據值的位置,在這個位置可以寫入和讀取數值,資料屬性有四個描述器行為的特性 [[Configurable]]:表示能否通過 delete 刪除屬性而重新定義屬性,預設值是ture [[Enumerab
PHP與MySQL程式設計讀書筆記(一)
一、PHP基本型別及函式 1. 短標籤 sprintf??? 2. 型別自動裝換 3. 與型別相關的函式 gettype(),settype(),判斷是否為某個型別:is_name() 變數賦
《MySQL技術內幕——SQL程式設計》讀書筆記(一)——SQL程式設計
一、資料庫的應用型別 對於SQL開發人員,必須先了解進行SQL程式設計的物件型別,即要開發的資料庫應用是哪種型別。 1、OLTP(OnLine Transaction Processing) 聯機
《Hive程式設計指南》讀書筆記 | 一文看懂Hive的資料型別和檔案格式
Hive支援關係型資料庫中的大多數基本資料型別,同時也支援關係型資料庫中很少出現的3種集合資料型別。和大多數資料庫相比,Hive具有一個獨特的功能,那就是其對於資料在檔案中的編碼方式具有非常大的靈活性。大多數資料庫對資料具有完全的控制,其包括對資料儲存到磁碟的過程的控制,也包括對資料生命週期的控制。而Hi
《你必須知道的.NET》讀書筆記一:小OO有大智慧
實現 職責 可靠性 基本 code cfile 生存 最好 min() 此篇已收錄至《你必須知道的.Net》讀書筆記目錄貼,點擊訪問該目錄可以獲取更多內容。 一、對象 (1)出生:系統首先會在內存中分配一定的存儲空間,然後初始化其附加成員,調用構造函數執行初始化,這
《JavaScript 高級程序設計》讀書筆記一 簡介
ron 設計 str 歷史 定義 程序 筆記一 scrip strong 一 歷史 二 實現 a. javascript三個部分: ECMAScript:由ECMA-262定義,提供核心語言功能; DOM:提供HTML的應用程序編程接口/提
《大型網站技術架構》讀書筆記一:大型網站架構演化
硬件 解決方案 更新 獨立 流量 操作 大型網站技術架構 負責 思維導圖 一、大型網站系統特點 (1)高並發、大流量:PV量巨大 (2)高可用:7*24小時不間斷服務 (3)海量數據:文件數目分分鐘xxTB (4)用戶分布廣泛,網絡情況復雜:網絡運營
《算法導論》讀書筆記(一)
列排序 not else archive stdlib.h 二分查找 printf ima fine 本章是本書的開篇,介紹了什麽是算法,為什麽要學習算法,算法在計算機中的地位及作用。 算法(algorithm)簡單來說就是定義良好的計算機過程,它取一個或一組值
文字上的演算法讀書筆記一--基礎知識
1.1 概率論 概率描述一些事情發生的可能性。 大數定理: 當試驗次數(樣本)足夠多的時候,事件出現的頻率無限接近於該事件真實發生的概率。 來表示隨機變數的概率,那麼就要滿足如下兩個特性: 聯合概率 表示兩個事件共同發生的概率,如果相互獨立,則 條件概率 是指在
Lua程式設計學習筆記(一) Lua基本語法(1)
Lua基本語法(一) 1. 開始 (1)基本常識 lua中的識別符號可以由任意字母、數字、下劃線構成的字串,但不能以數字開頭。 全域性變數不需要申明,直接賦值即可建立,刪除變數直接賦nil。未申明的變數不會報錯,直接返回nil。 行註釋以“–