如何制作窗口,或更像剪裁区域,我将能够绘制像素?
它可能会使用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调用?我会更高兴,当我能够从头开始创建窗口时,无论需要做多少工作:) “
答案 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)
我建议您尝试使用GLFW或glut加上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");
}
这是我的第一个答案。我希望我能帮忙,并且需要进行大量的搜索才能找到这些功能 除了我认为我从你的剧本中学到的东西比我向你展示的更多:)