C ++绘制像素问题

时间:2011-01-01 22:08:57

标签: c++ winapi pixel


如何制作窗口,或更像剪裁区域,我将能够绘制像素? 它可能会使用WinApi,但我不希望我的项目看起来像winapi,所以它会有

int main(){}

而不是

int WINAPI WinMain(HINSTANCE ...

我找到了一个例子,我可以在控制台窗口中绘图

int main()
{
    COLORREF color = RGB(255,0,0); // COLORREF to hold the color info

    SetConsoleTitle("Pixel In Console?"); // Set text of the console so you can find the window

    HWND hwnd = FindWindow(NULL, "Pixel In Console?"); // Get the HWND
    HDC hdc = GetDC(hwnd); // Get the DC from that HWND

    for( int i = 0 ; i < 50 ; i++ )
    {
    SetPixel(hdc, 5+i, 12, color); // SetPixel(HDC hdc, int x, int y, COLORREF color)
    }
        ReleaseDC(hwnd, hdc); // Release the DC
    DeleteDC(hdc); // Delete the DC
    system("pause");
    return(0);
}

但是我想要在我选择的区域上绘制,而不是控制台,它将保持焦点(当用户点击它时等)。

能够为这个程序处理简单的键盘/鼠标事件也很棒,但它不是我的主要目标,也许其他一些第三方库会帮助它。

我希望我已经清楚地解释了我想做什么,但英语不是我的母语,所以我很抱歉任何误解。

我会感谢任何帮助。


当我第一次使用这个网站时,我很抱歉在错误的地方发现了一些垃圾邮件或邮件,因为我不确定在哪里发布我的下一条邮件:-) 所以我想写的是:

” 否则,Allegro / SDL如何创建窗口?他们使用汇编程序调用或shell调用?我会更高兴,当我能够从头开始创建窗口时,无论需要做多少工作:) “

5 个答案:

答案 0 :(得分:4)

您不会喜欢这个 - 在Windows中,您必须创建一个窗口,然后重写WM_PAINT消息,然后绘制从系统调用时必须绘制的内容。这是老式的做事方式,并没有那么糟糕。

一些有趣且相关的链接:

http://www.winprog.org/tutorial/bitmaps.html

http://www.codeproject.com/Articles/66250/BeginPaint-EndPaint-or-GetDC-ReleaseDC.aspx

如果您真的想避免这一切,请尝试popcap。学习曲线可能比较陡峭,所以你可能真的想坚持使用GDI和HWND,无论它在开始时看起来多么困难和混乱。

答案 1 :(得分:2)

我建议您尝试使用GLFWglut加上OpenGL。 使用OpenGL,您将能够处理与图形处理(2D / 3D渲染)相关的所有事情,例如,GLFW库的作用是添加一些功能,如:窗口管理,事件管理,计时器,线程等

个人注意事项,请选择GLFW,因为我认为不再保持过剩......

答案 2 :(得分:1)

长话短说:您应该使用图形框架/窗口小部件工具包来创建窗口,然后从那里开始。

然后,根据您使用的框架,您将创建窗口并根据其参考修改像素。

我建议 SDL (小,可能正是您需要的), Allegro (类似)或 Qt (大)。

答案 3 :(得分:1)

否则,Allegro / SDL如何创建窗口?他们使用汇编程序调用或shell调用?当我能够从头开始创建窗口时,无论需要做多少工作,我都会更开心:)

答案 4 :(得分:1)

您的代码出现问题: 我尝试了你的代码,我发现这条线似乎出现在它的执行的某个实例中,但有时,当我执行它时,找不到红线!据我所知,这是因为你保留了这三个陈述:

// Set text of the console so you can find the window
SetConsoleTitle("Pixel In Console?"); 
HWND hwnd = FindWindow(NULL, "Pixel In Console?"); // Get the HWND
HDC hdc = GetDC(hwnd); // Get the DC from that HWND

但Windows只会在一段时间后更新您的窗口名称,因此如果您使这些语句一个接一个地执行,HWND hwnd = FindWindow(NULL, "Pixel In Console?");语句无法找到这样的窗口,因为Windows需要时间来更新标题通过:SetConsoleTitle("Pixel In Console?");

<强>解决方案: 您可以保留Sleep(int);(包括windows.h)或使用:

HWND hwnd = FindWindowA("ConsoleWindowClass",NULL); // Get the HWND

而不是

SetConsoleTitle("Pixel In Console?"); // Set text of the console so you can find the window HWND hwnd = FindWindow(NULL, "Pixel In Console?"); // Get the HWND

以下是示例程序:

#include <windows.h>
#include<conio.h>`
#include<iostream.h>`

POINT p;    //structure with coordinates to mouse location`

void main()
{
    COLORREF color = RGB(255,0,0); // COLORREF to hold the color info`

    HWND hwnd = FindWindowA("ConsoleWindowClass",NULL); // Get the HWND
    HDC hdc = GetDC(hwnd); // Get the DC from that HWND

    for( int i = 0 ; i < 400 ; i++ )
    {
        for(int j=0;j<50;j++)
            SetPixel(hdc, i, j, color);
    }
    while(1)
    {
          GetCursorPos(&p);
          ScreenToClient(hwnd,&p);
          cout<<p.x<<' '<<p.y;
          clrscr();
          if(GetAsyncKeyState(1)) //checks if left mouse button is pressed
          {
                //fool around with these functions:
                SetPixel(hdc,p.x,p.y,color); 
                //LineTo(hdc,p.x,p.y);
                //Rectangle(hdc,200,200,p.x,p.y);
                Sleep(10);
          }
    }
    ReleaseDC(hwnd, hdc); // Release the DC
    DeleteDC(hdc); // Delete the DC
    system("pause");
}

这是我的第一个答案。我希望我能帮忙,并且需要进行大量的搜索才能找到这些功能 除了我认为我从你的剧本中学到的东西比我向你展示的更多:)