不一樣的控制檯程式-----在控制檯中輸出圖片
阿新 • • 發佈:2019-01-09
做過程式設計的朋友們當然記得我們學習程式設計的控制檯程式,永遠是那麼一個黑黑的視窗。我們在裡面儘量做著我們的標準輸出,但是我們是否想過控制檯也有不為我們所知的一些祕密。在我的上一篇博文中,我寫過控制檯程式其實和我們的介面程式設計是一樣的,這裡我想來像大家展示並且證明一下我的觀點!((*^__^*) 嘻嘻……)希望大家喜歡。
在Windows下,我想大家都很清楚的知道我們建立了一個視窗,作業系統自然會給我們的視窗在系統核心中會有一個標識--(也就是我們通常說的HWND視窗控制代碼)。首先,我們大家猜一下,我們的控制檯程式有沒有視窗呢!呵呵…,當然它是有的,不然我的黑框框是什麼呢!它就是一個名副其實的視窗。那我們的控制檯程式有沒有視窗控制代碼呢?我想開始大家對於這個問題肯定有點猶豫,因為我們做了很長時間的程式設計都沒見過也沒人告訴我們,我們的控制檯的程式有一個控制代碼(Hwnd)。上面說了,在作業系統內部對於每個視窗作業系統都會給予一個控制代碼,當然對於我們的控制檯,作業系統也不會特殊對待,它同樣也有一個Hwnd。
好了,大家都知道控制檯程式有視窗控制代碼。但是他在那裡呢?我們怎樣得到它呢?各位朋友莫急,我這就告訴大家。下面是一個簡單的獲取控制檯視窗控制代碼的例子。
#include <stdio.h>
#include <windows.h>
typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();
PROCGETCONSOLEWINDOW GetConsoleWindow;
Int main()
{
HMODULE hKernel32 = GetModuleHandle("kernel32");
GetConsoleWindow= (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");
HWND cmd=GetConsoleWindow();
}
首先,我們的需要的系統API在Kernel32裡面,然後我們匯出GetConsoleWindow函式我們就可以實現獲得視窗控制代碼!那麼我們現在得到視窗控制代碼,我們能幹什麼呢?在這裡我告訴大家一個很興奮的事,我們得到了視窗控制代碼,在影象介面下能做的我們現在都可以做!如果你不信,你在視窗中畫個圓看看(你就知道我沒騙你了,不過記得要改變畫刷的顏色啊!)。
下面是我在控制檯中顯示一幅點陣圖的程式碼,大家也可以試試看,絕對是可行的!(要把點陣圖複製到你所建Project目錄下面,並且改名為1.bmp)
#include <stdio.h>
#include <windows.h>
typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)();
PROCGETCONSOLEWINDOW GetConsoleWindow;
Int main()
{
HMODULE hKernel32 = GetModuleHandle("kernel32");
GetConsoleWindow= (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");
HWND cmd=GetConsoleWindow();
HDC dc = GetDC(cmd);
HBITMAP hBitmap;
hBitmap=(HBITMAP)LoadImage (NULL,"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
HDC cmdmem = CreateCompatibleDC(dc);
SelectObject(cmdmem , hBitmap);
BitBlt(dc , 100 , 100 , 300 , 300 , cmdmem , 0 , 0 , SRCCOPY);
Return 1;
}
現在大家覺得怎麼樣!大家同意我上一篇博文的觀點嗎!(呵呵…)我們現在可以完成對控制檯做你想做的一切!Do it Now!
下面在介紹一些實用的控制檯函式,這裡我就不過多的介紹了,如果有興趣的朋友可以檢視MSDN或者Google!
GetSystenMenu-----------------------------------取得控制檯的系統選單
EnableMenuItem----------------------------------對選單項的操作
ReadConsoleOutputCharacter-------------------從控制檯緩衝區中讀出文字並儲存到變數中
GetStdHandle--------------------------------------取得標準輸入,輸出,錯誤的控制代碼
SetConsoleCursorPosition-----------------------設定控制檯游標的位置
ScrollConsoleScreenBuffer----------------------設定控制檯回滾的Buffer大小
SetConsoleDisplayMode-------------------------設定控制檯顯示模式(是否全屏)
mouse_event---------------------------------------模擬滑鼠操作
ReadConsoleInput--------------------------------命令列的控制輸出,獲取命令列的資訊
GetConsoleMode---------------------------------可以讓控制檯支援滑鼠
FillConsoleOutputAttribute---------------------彩色控制檯設定輸出的顏色
SetConsoleTextAttribute------------------------設定文字顏色
如果對於控制檯有不同理解的朋友,我希望可以在我的部落格中和我交流,讓我們都能有更深層次的理解。