用GDI学习C语言,控制台也能画图

来源:互联网 发布:旁氏米粹怎么样知乎 编辑:程序博客网 时间:2024/06/15 08:52
#include <stdio.h>#include <windows.h>#include <math.h>// 获取控制台窗口句柄 微软官方网站的程序 直接拿来用了HWND GetConsoleHwnd(void){#define MY_BUFSIZE 1024 // Buffer size for console window titles.    HWND hwndFound;         // This is what is returned to the caller.    char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated    char pszOldWindowTitle[MY_BUFSIZE]; // Contains original    GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);    wsprintf(pszNewWindowTitle,"%d/%d",        GetTickCount(),        GetCurrentProcessId());    SetConsoleTitle(pszNewWindowTitle);    Sleep(40);    hwndFound=FindWindow(NULL, pszNewWindowTitle);    SetConsoleTitle(pszOldWindowTitle);    return(hwndFound);}int main (void){    HWND hConsole = GetConsoleHwnd();    // 获得控制台窗口句柄    HDC hDC = GetDC(hConsole);    // 获得控制台窗口绘图DC    // 随意绘制的一些内容    // 创建一个画笔 相关知识查找MSDN 输入GDI方面的知识 创建填充用的笔刷用Brush    HPEN hPen = CreatePen(PS_SOLID, 1, RGB(200, 256,256));    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);    // 让DC选择此画笔    // 画线    MoveToEx(hDC,0, 250, NULL);    for(int i=0;i<500;i++)    {        LineTo(hDC,10*i,150+100*sin(i));    }    //InvalidateRect(hConsole, NULL, TRUE); // 刷新窗口    ReleaseDC(hConsole, hDC);// 释放DC     while (1);    return 0;}

键盘鼠标计时器 这几个比较常用:

#include <stdio.h>#include <windows.h>#include <math.h>int nPos = 0;#define TIMERID 1020HDC hDC = NULL;UINT nTimeId = TIMERID;HWND hConsole = NULL;HHOOK g_ms_hook = 0;HHOOK g_kb_hook = 0;#define WH_KEYBOARD_LL 13#define WH_MOUSE_LL 14#if (_WIN32_WINNT < 0x0400)    // 以下要看你安装的SDK版本/** Structure used by WH_KEYBOARD_LL*/typedef struct tagKBDLLHOOKSTRUCT {    DWORD   vkCode;    DWORD   scanCode;    DWORD   flags;    DWORD   time;    DWORD   dwExtraInfo;} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;/** Structure used by WH_MOUSE_LL*/typedef struct tagMSLLHOOKSTRUCT {    POINT   pt;    DWORD   mouseData;    DWORD   flags;    DWORD   time;    DWORD   dwExtraInfo;} MSLLHOOKSTRUCT, FAR *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;#endifLRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM l){    printf((w==WM_KEYDOWN)?"按下%c\n":"抬起%c\n",((PKBDLLHOOKSTRUCT)l)->vkCode);    return CallNextHookEx (g_kb_hook, code, w, l);}LRESULT CALLBACK ms_proc (int code, WPARAM w, LPARAM l){    if(w == WM_LBUTTONDOWN)        printf("按下左键\n");    else if(w == WM_LBUTTONUP)        printf("抬起左键\n");    else        printf("x:%d\ty:%d\n",((PMSLLHOOKSTRUCT)l)->pt.x,((PMSLLHOOKSTRUCT)l)->pt.y);    return CallNextHookEx (g_ms_hook, code, w, l);}// 来自:<span style="color: #008000; text-decoration: underline;">http://support.microsoft.com/kb/124103[/color]// 获取控制台窗口句柄 微软官方网站的程序 直接拿来用了HWND GetConsoleHwnd(void){#define MY_BUFSIZE 1024 // Buffer size for console window titles.    HWND hwndFound;         // This is what is returned to the caller.    char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated    char pszOldWindowTitle[MY_BUFSIZE]; // Contains original       GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);       wsprintf(pszNewWindowTitle,"%d/%d",        GetTickCount(),        GetCurrentProcessId());    SetConsoleTitle(pszNewWindowTitle);       Sleep(40);       hwndFound=FindWindow(NULL, pszNewWindowTitle);    SetConsoleTitle(pszOldWindowTitle);       return(hwndFound);}void CALLBACK TimerProc(HWND hwnd, UINT uMsg,    UINT idEvent, DWORD dwTime){    if (uMsg == WM_TIMER && idEvent == nTimeId)    {        hDC = GetDC(hConsole);// 获得控制台窗口绘图DC        // 随意绘制的一些内容        HPEN hPen = CreatePen(PS_SOLID, 1, RGB(200, nPos%256, (nPos*3)%256));    // 创建一个画笔 相关知识查找MSDN 输入GDI方面的知识 创建填充用的笔刷用Brush        HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);    // 让DC选择此画笔        for (int i=0; i<1000; i++)        {            // 画线            MoveToEx(hDC, (i+nPos)%800, (int)(sin(i/10.0)*100+200), NULL);               LineTo(hDC, (i+nPos)%800, (int)(sin((i+1)/10.0)*100+100));        }        if (nPos%70 == 0)            InvalidateRect(hConsole, NULL, TRUE); // 刷新窗口        SelectObject(hDC, hOldPen);// 恢复原有画笔        nPos = (nPos+20)%800;        ReleaseDC(hConsole, hDC);// 释放DC    }   }int main (void){    hConsole = GetConsoleHwnd();    // 获得控制台窗口句柄       nTimeId = SetTimer(NULL, TIMERID, 100, TimerProc);    // 为系统定制一个计时器    g_kb_hook = SetWindowsHookEx (WH_KEYBOARD_LL,kb_proc,GetModuleHandle (NULL),0);        // 为键盘输入设置一个钩子 来监听用户的键盘输入    g_ms_hook = SetWindowsHookEx (WH_MOUSE_LL, ms_proc,GetModuleHandle(NULL),0);        // 为鼠标设置一个钩子 来监听用户的鼠标点击和移动    if (g_kb_hook == NULL || g_ms_hook == NULL)    // 判断钩子是否设置成功    {        printf("安装钩子出错\n");        return 0;    }    // 设置消息循环    MSG msg;    while (GetMessage (&msg, NULL, 0, 0))    {        TranslateMessage (&msg);        DispatchMessage (&msg);    }    UnhookWindowsHookEx (g_kb_hook);    return 0;}
WM_PAINT没搞定 钩子WH_CALLWNDPROC、WH_GETMESSAGE之类的挂在上面编译器、资源管理器、其他窗口都崩了 没调为啥 所以就没搞 
总体来说 一般情况没什么必要在控制台下绘图 也就是给新手玩玩 所以此代码此方法只供娱乐


绘图的话:
在HDC hDC = GetDC(hConsole)
和ReleaseDC(hConsole, hDC);
之间添代码就行
想用什么函数可以查MSDN里的GDI函数

绘图属性函数GetBkColor 获取当前背景色 SetBkColor 设置当前背景色 GetBkMode 获取背景模式 SetBkMode 设置背景模式 GetPolyFillMode 获取当前多边形填充模式 SetPolyFillMode 设置多边形填充模式 GetROP2 获取当前绘图模式 SetROP2 设置当前绘图模式 GetStretchBltMode 获取当前位图拉伸模式 SetStretchBltMode 设置位图拉伸模式 GetTextColor 获取当前文本颜色 SetTextColor 设置文本颜色 GetColorAdjustment 获取用于设备上下文的颜色调整值 SetColorAdjustment 使用指定值设置设备上下文的颜色调整值线输出函数GetCurrentPosition 获取笔的当前位置(以逻辑坐标表示) MoveTo 移动当前位置 LineTo 从当前位置到一点画直线,但不包括那个点 Arc 画一段椭圆弧 ArcTo 画一段椭圆弧。除了更新当前位置以外,这个函数与Arc类似 AngleArc 画一条线段和圆弧,把当前位置移到圆弧终点 GetArcDirection 对设备上下文返回当前圆弧方向 SetArcDirection 设备圆弧和矩形函数要用到的绘图方向 PolyDraw 画一组线段和Bezier样条。这个函数更新当前位置Polyline画一组与指定点连接的线段 PolyPolyline 画多组相连线段。这个函数不使用也不更新当前位置 PolylineTo 画一条或多条直线,并把当前位置移到最后一条直线的终点 PolyBezier 画一条或多条Bezier样条。不使用也不更新当前位置 PolyBezierTo 画一条或多条Bezier样条,并把当前位置移到最后一条Bezier样条的终点  简单绘图函数FillRect 用指定画刷填充给定矩形 FrameRect 在矩形周围绘制边界 InvertRect 反转矩形内容 DrawIcon 绘制图标 DrawDragRect 拖拽矩形时擦除并重绘它 FillSolidRect 用实颜色填充矩形 Draw3Drect 绘制三维矩形 DrawEdge 绘制矩形边 DrawFrameControl 绘制帧控件 DrawState 显示图像并应用可视化效果来表示一个状态 椭圆和多边形函数Chord 绘制椭圆弧(椭圆和一条线段相交围成的闭合图形) DrawFocusRect 绘制用于表示焦点的风格的矩形 Ellipse 绘制椭圆 Pie 绘制饼形图 Polygon 绘制多边形,包含由线段连接的一个或多个点(顶点) PolyPolygon 创建使用当前多边形填充模式的两个或多个多边形,多边形可以相互分开或叠加 Polyline 绘制多边形,包含连接指定点的一组线段 Rectangle 使用当前笔绘制矩形,用当前画刷填充 RoundRect 使用当前笔绘制圆角矩形,用当前画刷填充  位图函数PatBlt 创建位特征 BitBlt 从指定设备上下文拷贝位图 StretchBlt 把位图由源矩形和设备移动到目标矩形,必要时拉伸或压缩位图以适合目标矩形的维数 GetPixel 获取指定点像素的RGB颜色值 SetPixel 设置指定点像素为最接近指定色的近似值 SetPixelV 设置指定点坐标为最接近指定色的近似值。SetPixelV比SetPixel快,原因是它不用返回实际绘制点的颜色值 FloodFill 用当前画刷填充区域 ExtFloodFill 用当前画刷填充区域。比FloodFill成员函数提供更多灵活性 MaskBlt 使用给定屏蔽和光栅操作对源和目标位图合并颜色数据 PlgBlt 从源设备上下文的指定矩形到给定设备上下文中指定平行多边形,执行颜色数据位的位块传递  文本函数TextOut 用当前选取字体在指定位置写字符串 ExtTextOut 用当前选取字体在矩形区域写字符串 TabbedTextOut 在指定位置写字符串,制表符扩展为制表符停止位置数组中指定值 DrawText 在指定矩形内绘制格式化文本 GetTextExtent 使用当前字体在属性设备上下文上计算文本行的宽度和高度,确定维数 GetOutputTextExtent 使用当前字体在输出设备上下文上计算文本行的宽度和高度,确定维数 GetTabbedTextExtent 使用当前字体在属性设备上下文上计算字符串的宽度和高度 GetOutputTabbedTextExtent 使用当前字体在输出设备上下文上计算字符串的宽度和高度 GrayString 在给定位置绘制暗(灰色)文本 GetTextAlign 获取文本对齐标记 SetTextAlign 设置文本对齐标记 GetTextFace 以空终止字符串形式把当前字体字样名拷贝到缓冲区 GetTextMetrics 从属性设备上下文为当前字体获取度量 GetOutputTextMetrics 从输出设备上下文为当前字体获取度量 SetTextJustification 把空格添加到字符串的中断字符 GetTextCharacterExtra 对字符间空格数量获取当前设置 SetTextCharacterExtra 设置字符间空格数量  字体函数GetFontData 从比例字体文件获取字体度量信息。获取的信息通过指定字体文件与返回信息长度的偏移量标识 GetKerningPairs 获取指定设备上下文中当前选取的字体字符实对 GetOutlineTextMetrics 获取用于TrueType字体的字体度量信息 GetGlyphOutline 获取用于当前字体中外线字符串的外线曲线或位图 GetCharABCWidths 从当前字体获取给定范围相继字符以逻辑单位计数的宽度 GetCharWidth 从当前字体获取给定范围相继字符的分数宽度 GetOutputCharWidth 从使用输出设备上下文的当前字体获取相继字符组中各个字符的宽度 SetMapperFlags 改变字体映射表在从逻辑字体到物理字符映射时使用的算法 GetAspectRatioFilter 获取当前长宽比过滤器的设置 


原创粉丝点击