Windows程序內(nèi)部運行機制實例詳解
本文以孫鑫老師VC++教程中的程序為基礎,詳細講解了Windows程序內(nèi)部運行機制,相信可以幫助大家更好的理解Windows程序運行原理及相應的VC++程序設計。具體內(nèi)容如下:
創(chuàng)建一個Win32應用程序步驟:
1、編寫WinMain函數(shù);
2、創(chuàng)建窗口(步驟如下):
a、設計(一個)窗口類(WNDCLASS)
b、注冊(該)窗口類。
c、創(chuàng)建窗口。
d、顯示并更新窗口。
3、編寫消息循環(huán)。
4、編寫窗口過程函數(shù)。
//WinMain.cpp #include <windows.h> #include <stdio.h> LRESULT CALLBACK WinAzeProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int nCmdShow // show state ) { //設計一個窗口類 WNDCLASS wndcls; wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0; wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor = LoadCursor(NULL, IDC_CROSS); wndcls.hIcon = LoadIcon(NULL, IDI_ERROR); wndcls.hInstance = hInstance; //應用程序?qū)嵗浔蒞inMain函數(shù)傳進來 wndcls.lpfnWndProc = WinAzeProc; wndcls.lpszClassName = "aze_003"; wndcls.lpszMenuName = NULL; wndcls.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); //注冊窗口類 //創(chuàng)建窗口,定義一個變量用來保存成功創(chuàng)建后返回的句柄 HWND hwnd; hwnd = CreateWindow("aze_003", "first Application", WS_OVERLAPPEDWINDOW, 0, 0, 600, 500, NULL, NULL,hInstance, NULL); ShowWindow(hwnd, SW_SHOWNORMAL); //顯示窗口 UpdateWindow(hwnd); //刷新窗口 //定義消息結(jié)構(gòu)體,開始消息循環(huán) MSG msg; while( GetMessage(&msg, NULL, 0, 0) ) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } //編寫窗口過程函數(shù) LRESULT CALLBACK WinAzeProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_CHAR: char szChar[20]; sprintf(szChar, "char code is %d", wParam); MessageBox(hwnd, szChar, "char", 0); break; case WM_LBUTTONDOWN: MessageBox(hwnd, "mouse clicked", "message", 0); HDC hdc; hdc = GetDC(hwnd); //不能在響應WM_PAINT消息時調(diào)用 TextOut( hdc, 0, 50, "程序員之家!",strlen("程序員之家!") ); ReleaseDC(hwnd, hdc); break; case WM_PAINT: HDC hDC; PAINTSTRUCT ps; hDC = BeginPaint(hwnd, &ps); //BeginPaint只能在響應WM_PAINT消息是調(diào)用 TextOut(hDC, 0, 0, "http://www.sunxin.org", strlen("http://www.sunxin.org")); EndPaint(hwnd, &ps); break; case WM_CLOSE: if( IDYES == MessageBox(hwnd, "是否真的退出?", "message", MB_YESNO) ) { DestroyWindow(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; }
程序運行后顯示界面如下:
窗口分為客戶區(qū)(是窗口的一部分)與非客戶區(qū)。
標題欄、菜單欄、系統(tǒng)菜單、最?。ù螅┗?、可調(diào)邊框統(tǒng)稱為窗口的非客戶區(qū),由Windows系統(tǒng)管理;應用程序主要管理客戶區(qū)的外觀及操作(顯示文字、繪制圖形)。
對話框、消息框也是一種窗口;對話框上還包括許多子窗口:按鈕、單選按鈕、復選框、組狂、文本編輯框等。
2、窗口與句柄:
在Windows應用程序中,窗口是通過窗口句柄(HWND)來標識的;要對某個窗口進行操作,就必須要得到這個窗口的句柄。
句柄是Windows程序中一個重要的概念(圖標句柄(HICON)、光標句柄(HCURSOR)、畫刷句柄(HBRUSH))。
3、消息與消息隊列:
Windows程序設計模式是一種事件驅(qū)動方式的程序設計模式,主要是基于消息的。(當系統(tǒng)感知到一事件時(如點擊鼠標),系統(tǒng)會將這個事件包裝成一個消息,投遞到應用程序的消息隊列中,然后應用程序從消息隊列中取出消息并進行響應。在這個處理過程中,操作系統(tǒng)也會給應用程序“發(fā)送消息”。“發(fā)送消息”:實際指:操作系統(tǒng)調(diào)用程序中一個負責處理消息的窗口過程函數(shù))
(1)消息:Windows中,消息由MSG結(jié)構(gòu)體表示,如下:
//The MSG structure contains message information from a thread's message queue. typedef struct tagMSG { HWND hwnd; //消息所屬的窗口,消息都是與窗口相關聯(lián)的 UINT message; //the message identifier WPARAM wParam; //指定消息的附加消息 LPARAM lParam; //指定消息的附加消息 DWORD time; //消息投遞到隊列中的時間 POINT pt; //鼠標的當前位置 } MSG, *PMSG;
Windows中,消息是由一個個數(shù)值表示的;Windows將消息對應的數(shù)值定義為WM_XXX宏(WM:Window Message)的形式,XXX對應某種消息的英文拼寫的大寫形式。如:WM_LBUTTONDOWN:鼠標左鍵按下消息、WM_KEYDOWN:鍵盤按下消息、WM_CHAR:字符消息···
(2)消息隊列:每一個Windows應用程序開始執(zhí)行后,系統(tǒng)都會為改程序創(chuàng)建一個消息隊列,這個消息隊列用來存放改程序創(chuàng)建的窗口的消息。
(3)進隊消息 與 不進隊消息:
進隊的消息將由系統(tǒng)放入到應用程序的消息隊列中,然后由應用程序取出并發(fā)送;
不進隊消息在系統(tǒng)調(diào)用窗口過程時,直接發(fā)送給窗口;
兩者最終都是有系統(tǒng)調(diào)用窗口過程函數(shù)對消息進行處理。
4、WinMain函數(shù)
(一)MSDN上的WinMain函數(shù)定義如下(備有詳盡的注釋):
//The WinMain function is called by the system as the initial entry point for a Windows-based application. int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance當前窗口句柄 HINSTANCE hPrevInstance, // handle to previous instance前一個打開的窗口句柄 LPSTR lpCmdLine, // command line 指定傳遞給應用程序的*命令行*參數(shù) int nCmdShow // show state 指定窗口應該如何顯示,如:最大(小)化、隱藏等 );
(二)窗口類的結(jié)構(gòu)體的定義:
(1)本文程序中對應代碼如下:
typedef struct _WNDCLASS { UINT style; //指定*這一類型*窗口的樣式,如:CS_HREDRAW、CS_VREDRAW、CS_NOCLOSE、CS_DBLCLKS WNDPROC lpfnWndProc; //函數(shù)指針,指向窗口過程函數(shù)(窗口過程函數(shù)是一回調(diào)函數(shù)) int cbClsExtra; //一般為0 int cbWndExtra; //同上 HINSTANCE hInstance; //指定包含窗口過程的程序的實例句柄 HICON hIcon; //指定窗口類的圖標句柄 HCURSOR hCursor; //指定窗口類的光標句柄 HBRUSH hbrBackground; //指定窗口類的背景畫刷句柄;當窗口發(fā)生重繪值,系統(tǒng)使用這里指定的畫刷來查處窗口的背景 LPCTSTR lpszMenuName; //指定菜單資源的名字 **菜單并不是一個窗口** LPCTSTR lpszClassName; //指定窗口類的名字 } WNDCLASS, *PWNDCLASS;
回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時有另一方調(diào)用的,用于該事件或條件進行響應。
回調(diào)函數(shù)的實現(xiàn)機制是:
①定義一個回調(diào)函數(shù)。
②提供函數(shù)實現(xiàn)的一方在初始化的時候,將回調(diào)函數(shù)的函數(shù)指針注冊給調(diào)用者。
?、?span style="color: #0000ff">當特定的事件或條件發(fā)生的時候,調(diào)用者使用函數(shù)指針調(diào)用回調(diào)函數(shù)對事件進行處理。
針對Windows的消息處理機制,窗口過程函數(shù)被調(diào)用的過程如下:
①在設計窗口類的時候,將窗口過程函數(shù)的地址賦值給lpfnWndProc成員變量;
?、?span style="color: #0000ff">調(diào)用RegisterClass(&wndclass)注冊窗口類,那么系統(tǒng)就有了我們所編寫的窗口過程函數(shù)的地址。
?、?span style="color: #0000ff">當應用程序接收到某一窗口的消息時,調(diào)用DispatchMessage(&msg)將對消息回傳給系統(tǒng)。系統(tǒng)則利用先前注冊窗口類時得到的函數(shù)指針,調(diào)用窗口過程函數(shù)對消息進行處理。
提示:一個Windows程序可以包含多個窗口過程函數(shù),一個窗口過程總是與某一個特定的窗口類相關聯(lián)(通過WNDCLASS結(jié)構(gòu)體中的lpfnWndProc成員變量指定),基于該窗口類創(chuàng)建的窗口使用同一個窗口過程。
lpfnWndProc成員變量的類型是WNDPROC,定義如下:
typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); //LRESULT=long, CALLBACK=_stdcall WNDPROC是函數(shù)指針類型。
注意:WNDPROC被定義為指向窗口過程函數(shù)的指針類型,窗口過程函數(shù)的格式必須與WNDPROC相同。
在VC++中,資源是通過標識符(ID)來標識的,同一個ID可以標識多個不同的資源(資源的ID本質(zhì)上是一個整數(shù))。如:菜單資源:IDM_XXX(M表示Menu)、圖標資源:IDI_XXX(I表示圖標)、按鈕資源:IDB_XXX(B表示Button)
可以調(diào)用GetStockObject(int fnObject) 來得到系統(tǒng)的標準畫刷。聲明如下:
//The GetStockObject function retrieves a handle to one of the stock pens, brushes, fonts, or palettes. HGDIOBJ GetStockObject( int fnObject // stock object type );
GetStockObject函數(shù):返回多種資源對象的句柄,如:畫刷、畫筆、字體、調(diào)色板等;
函數(shù)返回時,需進行類型轉(zhuǎn)換。如:
wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
(2)注冊窗口類:設計窗口類(WNDCLASS)后,需要調(diào)用RegisterClass函數(shù)對其進行注冊,注冊成功后,才可以創(chuàng)建該類型的窗口。聲明如下:
ATOM RegisterClass( CONST WNDCLASS *lpWndClass // class data, 窗口類對象的指針 // Pointer to a WNDCLASS structure. You must fill the structure with the appropriate class attributes before passing it to the function. );
(3)創(chuàng)建窗口:CreateWindow函數(shù)聲明如下:
HWND CreateWindow( LPCTSTR lpClassName, // registered class name 即:窗口類WNDCLASS的lpszClassName成員指定的名稱(必須先注冊) LPCTSTR lpWindowName, // window name 指定窗口的名字 DWORD dwStyle, // window style 指定創(chuàng)建窗口的樣式 如:WS_OVERLAPPEDWINDOW int x, // horizontal position of window int y, // vertical position of window int nWidth, // window width int nHeight, // window height HWND hWndParent, // handle to parent or owner window 指定被創(chuàng)建窗口的父窗口句柄 HMENU hMenu, // menu handle or child identifier HINSTANCE hInstance, // handle to application instance LPVOID lpParam // window-creation data 作為WM_CREATE消息的附加參數(shù)lParam傳入的數(shù)據(jù)指針(一般為:NULL) );
如果窗口創(chuàng)建成功,CreateWindow函數(shù)將返回系統(tǒng)為該窗口分配的句柄;否則,返回NULL。
·注意:在創(chuàng)建窗口之前應先定義一個窗口句柄變量來接收創(chuàng)建窗口之后的句柄值。
顯示及更新窗口:
(4)顯示窗口:ShowWindow聲明如下:
BOOL ShowWindow( HWND hWnd, // handle to window 該參數(shù)為成功創(chuàng)建窗口后返回的那個窗口句柄 int nCmdShow // show state 如:SW_HIDE、SW_SHOW、SW_SHOWNORMAL、SW_SHOWMINIMIZED、SW_SHOWMAXIMIZED·· );
(5)更新(刷新)窗口:UpdateWindow函數(shù)聲明原型如下:
BOOL UpdateWindow( HWND hWnd // handle to window 創(chuàng)建成功后的窗口句柄 );
UpdateWindow函數(shù)通過發(fā)送一個WM_PAINT消息來刷新窗口,UpdateWindow將WM_PAINT消息直接發(fā)送給了窗口過程函數(shù)進行處理,而沒有放到消息隊列里面。
(三)、消息循環(huán)
窗口 創(chuàng)建、顯示、更新后;需要編寫一個消息循環(huán),不斷的從消息隊列中取出消息,并進行響應。
GetMessage()函數(shù):從消息隊列中取出消息
BOOL GetMessage( LPMSG lpMsg, // message information 指向一個消息(MSG)結(jié)構(gòu)體,GetMessage從線程的消息隊列中取出的消息信息將保存在該結(jié)構(gòu)體對象中 HWND hWnd, // handle to window 指定接收屬于哪一個窗口的消息;NULL:用于接收屬于調(diào)用線程的所有窗口的窗口消息 UINT wMsgFilterMin, // first message 指定獲取打的消息的最小值 UINT wMsgFilterMax // last message 如果wMsgFilterMin=0和wMsgFilterMax=0,則接收所有消息 );
GetMessage函數(shù)接收到除WM_QUIT外的消息均返回非零值。
//消息循環(huán)代碼,一般形式 MSG msg; while( GetMessage(&msg, NULL, 0, 0) ) { TranslateMessage(&msg); //TranslateMessage函數(shù)將虛擬鍵消息*轉(zhuǎn)換*為字符消息,被投遞到調(diào)用線程的消息隊列中,當下一次調(diào)用GetMessage函數(shù)時被取出 DispatchMessage(&msg); //DispatchMessage函數(shù)分派一個消息到窗口過程,有窗口過程函數(shù)對消息進行處理 //DispatchMessage實際上是將消息會傳給操作系統(tǒng),有操作系統(tǒng)調(diào)用窗口過程函數(shù)對消息進行處理(響應) }
Windows應用程序的消息處理機制如下圖所示:
Windows應用程序的消息處理過程:
?。?)操作系統(tǒng)就收到應用程序的窗口消息,將消息投遞到該應用程序的消息隊列中。
?。?)應用程序在消息循環(huán)匯總調(diào)用GetMessage函數(shù)從消息隊列中取出一條一條的消息。取出消息后,應用程序可以對消息進行一些預處理,如:放棄對某些消息的響應,或者調(diào)用TranslateMessage產(chǎn)生新的消息。
?。?)應用程序調(diào)用DisPatchMessage,將消息回傳給操作系統(tǒng)。消息是由MSG結(jié)構(gòu)體對象來表示的,其中就包含了接收消息的窗口的句柄。故:DisPatchMessage函數(shù)總能進行正確的傳遞。
?。?)操作利用WNDCLASS結(jié)構(gòu)體的lpfnWndProc成員保存的窗口過程函數(shù)的指針調(diào)用窗口過程,對消息進行處理(即“系統(tǒng)給應用程序發(fā)送了消息”)。
補充:
(1)從消息隊列中獲取消息還可以調(diào)用PeekMessage函數(shù),函數(shù)原型如下:
BOOL PeekMessage( LPMSG lpMsg, // message information HWND hWnd, // handle to window UINT wMsgFilterMin, // first message UINT wMsgFilterMax, // last message UINT wRemoveMsg // removal options );
前四個參數(shù)與GetMessage函數(shù)的參數(shù)作用相同;
最后一個參數(shù)指定消息獲取的方式;如果設為PM_NOREMOVE, 那么消息將不會從消息隊列中被移除;如果設為PM_REMOVE, 那么消息將從消息隊列中被移除(與GetMessage函數(shù)的行為一致)
(2)發(fā)送消息可以使用SendMessage和PostMessage函數(shù)。
SendMessage將消息直接發(fā)送給窗口,并調(diào)用該窗口的窗口過程進行處理;在窗口過程對消息處理完畢后,該函數(shù)才返回(SendMessage發(fā)送的消息為不進隊消息)。
PostMessage函數(shù)將消息放入與創(chuàng)建窗口的線程相關聯(lián)的消息隊列后立即返回。
PostThreadMessage函數(shù),用于向線程發(fā)送消息。
對于線程消息,MSG結(jié)構(gòu)體中的hwnd成員為NULL。
(四)、編寫窗口過程函數(shù):用于處理發(fā)送給窗口的消息
LRESULT CALLBACK WindowProc( //窗口過程函數(shù)的名字可以隨便取,如:WinAzeProc,但函數(shù)聲明與定義要一致; HWND hwnd, // handle to window UINT uMsg, // message identifier 消息代碼 WPARAM wParam, // first message parameter 消息代碼的兩個附加值 LPARAM lParam // second message parameter );
提示:系統(tǒng)通過窗口過程函數(shù)的地址(指針)來調(diào)用窗口過程函數(shù),而不是名字。
//編寫窗口過程函數(shù) LRESULT CALLBACK WinAzeProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { case WM_CHAR: //通過調(diào)用TranslateMessage函數(shù)轉(zhuǎn)換得到 char szChar[20]; sprintf(szChar, "char code is %d", wParam); MessageBox(hwnd, szChar, "char", 0); break; case WM_LBUTTONDOWN: MessageBox(hwnd, "mouse clicked!", "message", 0); HDC hdc; hdc = GetDC(hwnd); //用hdc保存GetDC函數(shù)返回的與特定窗口相關聯(lián)的DC的句柄。 //GetDC()不能在響應WM_PAINT消息時調(diào)用 TextOut( hdc, 0, 50, "程序員之家!",strlen("程序員之家!") ); //TextOut利用得到的DC句柄在指定的位置(0,50)出輸出一行文字 ReleaseDC(hwnd, hdc); //釋放hdc break; case WM_PAINT: //當窗口客服區(qū)的一部分或者全部變?yōu)椤盁o效”時,系統(tǒng)會發(fā)送WM_PAINT消息,通知應用程序重新繪制窗口 //窗口剛創(chuàng)建時,客戶區(qū)是無效狀態(tài),當調(diào)用UpdateWindow函數(shù)時,會發(fā)送WM_PAINT消息給窗口過程,對窗口進行刷新 //當窗口從無到有、改變尺寸、最小化在恢復、被其他窗口遮蓋后在顯示時,窗口的客戶區(qū)都將變?yōu)闊o效,此時系統(tǒng)會給應用程序發(fā)送WM_PAINT消息,通知應用程序重新繪制 //提示:窗口大小發(fā)生變化時,是否發(fā)生重繪,取決于WNDCLASS結(jié)構(gòu)體中style成員是否設置了CS_HREDRAW和CS_VREDRAW標志 HDC hDC; PAINTSTRUCT ps; //ps用于接收繪制的信息 hDC = BeginPaint(hwnd, &ps); //BeginPaint只能在響應WM_PAINT消息是調(diào)用 TextOut(hDC, 0, 0, "http://www.sunxin.org", strlen("http://www.sunxin.org")); EndPaint(hwnd, &ps); break; case WM_CLOSE: if( IDYES == MessageBox(hwnd, "是否真的退出?", "message", MB_YESNO) ) { DestroyWindow(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); //DefWindowProc調(diào)用默認的窗口過程,對應用程序沒有處理的其他消息提供默認處理。 //對于大多數(shù)的消息,應用程序可以直接調(diào)用DefWindowProc函數(shù)進行處理。 //在編寫窗口過程時,應將DefWindowProc函數(shù)的調(diào)用放到default語句中,并將該函數(shù)的返回值作為窗口過程函數(shù)的返回值。 } return 0; }
提示:要在窗口中輸出文字或者顯示圖形,需要用到設備描述表(Device ConText)。
設備描述表(簡稱DC):
DC是一個包含設備(物理輸出設備,如顯示器、設備驅(qū)動器)信息的結(jié)構(gòu)體,在Windows平臺下,所有的圖形操作都是利用DC來完成的。
第30、31行代碼:在調(diào)用BeginPaint時,如果客戶區(qū)的背景還沒有被擦除,那么BeginPaint會發(fā)送WM_ERASEBKGND消息給窗口,系統(tǒng)就會使用WNDCLASS結(jié)構(gòu)體的hbrBackGround成員指定的畫刷來擦除背景。如果我們想要讓某個圖形時鐘在窗口中顯示,就應該將圖形的繪制操作放到響應WM_PAINT消息的代碼中,如TextOut()的位置。
第34-48行代碼:DestroyWindow函數(shù)在銷毀窗口后會向窗口過程發(fā)送WM_DESTROY消息。注意:此時窗口雖然銷毀了,但應用程序并沒有退出。故:如果自己要控制程序是否退出,應該在WM_CLOSE消息的響應代碼中完成。
對WM_CLOSE消息的響應并不是必須的,如果應用程序沒有對該消息進行響應,系統(tǒng)將把這條消息傳給DefWindowProc函數(shù),而DefWindowProc函數(shù)則條用DestroyWindow函數(shù)來響應 這條WM_CLOSE消息。
第40-42行代碼:DestroyWindow函數(shù)在銷毀窗口后,會給窗口過程發(fā)送WM_DESTROY消息, 然后在該消息的響應代碼中調(diào)用PostQuitMessage函數(shù)。PostQuitMessage函數(shù)項應用程序的消息隊列中投遞一條WM_QUIT消息并返回。GetMessage函數(shù)只有在收到WM_QUIT消息時才返回0,此時消息循環(huán)才結(jié)束,程序退成。
想讓程序正常退出,我們必須響應WM_DESTROY消息,并在消息響應代碼中調(diào)用PostQuitMessage,向應用程序的消息隊列中投遞WM_QUIT消息。傳遞給PostQuitMessage函數(shù)的參數(shù)值將作為WM_QUIT消息的wParam參數(shù),這個值通常用做WinMain函數(shù)的返回值。
您可能感興趣的文章
- 01-10使用OpenGL實現(xiàn)3D立體顯示的程序代碼
- 01-10基于atoi()與itoa()函數(shù)的內(nèi)部實現(xiàn)方法詳解
- 01-10內(nèi)部排序之堆排序的實現(xiàn)詳解
- 01-10基于C程序啟動代碼的深入分析
- 01-10探討:程序在內(nèi)存中的分配(常量,局部變量,全局變量,程序代碼)問
- 01-10用C++實現(xiàn)隊列的程序代碼
- 01-10C語言程序設計50例(經(jīng)典收藏)
- 01-10如何將C語言代碼轉(zhuǎn)換為應用程序(也就是編譯)
- 01-10使用VC6.0對C語言程序進行調(diào)試的基本手段分享
- 01-10C語言小程序 楊輝三角示例代碼


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)