| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4528 人关注过本帖, 2 人收藏
标题:【新年散分】送一个小代码:控制台下绘图、键盘、鼠标控制
只看楼主 加入收藏
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
结帖率:74.19%
收藏(2)
已结贴  问题点数:100 回复次数:24 
【新年散分】送一个小代码:控制台下绘图、键盘、鼠标控制
这儿高手有的是 就不多解释了 我用VC6调试了下 没问题:
程序代码:
#include <stdio.h>
#include <windows.h>
#include <math.h>

// 来自:<span style="color: #008000; text-decoration: underline;">http://support.[/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);
}

int main (void)
{
    HWND hConsole = GetConsoleHwnd();    // 获得控制台窗口句柄
   
    int nPos = 0;
    while (1)
    {
        HDC 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<300; 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;

        // 停顿时间
        Sleep(200);

        ReleaseDC(hConsole, hDC);// 释放DC
    }
   
    return 0;
}

搜索更多相关主题的帖子: 控制台 鼠标 键盘 
2011-12-31 22:52
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
键盘鼠标计时器 这几个比较常用:
程序代码:
#include <stdio.h>
#include <windows.h>
#include <math.h>

int nPos = 0;

#define TIMERID 1020
HDC 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;
#endif

LRESULT 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.[/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;
}

 

[ 本帖最后由 cdmalcl 于 2011-12-31 22:54 编辑 ]
2011-12-31 22:52
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
WM_PAINT没搞定 钩子WH_CALLWNDPROC、WH_GETMESSAGE之类的挂在上面编译器、资源管理器、其他窗口都崩了 没调为啥 所以就没搞
总体来说 一般情况没什么必要在控制台下绘图 也就是给新手玩玩 所以此代码此方法只供娱乐

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

主要还是看MSDN 如果不愿意看 可以百度 很多 举个例子:
http://zhidao.baidu.com/question/69033901.html
http://wenku.baidu.com/view/76107860ddccda38376baf36.html
程序代码:
绘图属性函数
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 获取当前长宽比过滤器的设置 





[ 本帖最后由 cdmalcl 于 2011-12-31 23:09 编辑 ]
2011-12-31 22:54
绿茶盖儿
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:363
专家分:1852
注 册:2011-9-3
收藏
得分:6 
果断占位
2011-12-31 22:56
暴风雪282
Rank: 4
等 级:业余侠客
帖 子:61
专家分:295
注 册:2011-10-4
收藏
得分:6 
画图的程序还看不懂...

Dance like there is nobody.
2011-12-31 22:57
smallmoon521
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:517
专家分:1373
注 册:2008-4-21
收藏
得分:6 
代码很规范,看着都觉得舒服,赞一个
接分

为游戏狂~~!!    大家努力编哈!
2011-12-31 23:13
young512
Rank: 1
等 级:新手上路
帖 子:18
专家分:6
注 册:2011-8-13
收藏
得分:6 
大哥啊以后不懂的群里照应照应哈
2011-12-31 23:18
CrystalFan
Rank: 8Rank: 8
来 自:江苏南京
等 级:蝙蝠侠
帖 子:187
专家分:802
注 册:2009-7-30
收藏
得分:6 
抢楼收分
2011-12-31 23:18
CrystalFan
Rank: 8Rank: 8
来 自:江苏南京
等 级:蝙蝠侠
帖 子:187
专家分:802
注 册:2009-7-30
收藏
得分:0 
果然不错,赞一个!!
2011-12-31 23:28
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:6 
顶你啊

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2011-12-31 23:49
快速回复:【新年散分】送一个小代码:控制台下绘图、键盘、鼠标控制
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022087 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved