我注意到使用任务管理器,以下代码中有GDI泄漏.执行此代码的进程中GDI对象的计数每次执行时增加1,但我似乎无法找到问题.
任何帮助,将不胜感激.
// create new DC based on current
HDC hDC = CreateCompatibleDC(GetDC());
// select a bitmap into the new DC and keep the old one
HGDIOBJ hOldObj = SelectObject (hDC,hBM);
// do somthing here --> 100% no leak here
SomeFunction (hDC);
// select the old object back from whence it came and delete whats returned
DeleteObject (SelectObject (hDC,hOldObj));
// delete the DC
DeleteDC(hDC);
// delete the tmp object
DeleteObject (hOldObj);
Run Code Online (Sandbox Code Playgroud)
R M
我需要使用GDI +打印并交错2个5条形码(18位无校验和).我使用Web上的一些代码为代码128条形码做了这个.条码扫描器unfortunatley不读取代码128所以我不得不求助于ITF条形码.
谢谢,肯
有没有人知道讨论GDI +性能的任何可靠(并且希望是广泛的)书籍/网站(超出明显的范围)?
例如,我最近遇到了这个优秀的实验.我最近也注意到这种Graphics.FillPath()方式比方式更快Graphics.DrawPath().我很想知道我缺少的其他重要信息.
亲善,大卫
我试图用gdi创建球动画,但我不能让它工作.我用它创造了一个球
Graphics graphics(hdc);
Run Code Online (Sandbox Code Playgroud)
钢笔(颜色(255,0,0,255)); graphics.DrawEllipse(&pen,sf,0,10,10); 我有while循环,循环并添加1到sf值基本上像这个sf ++; 比我尝试重新绘制窗口(它不起作用)所以生病最终有一个以上的圈; /这里是循环(循环是int WM_PAINT)
while(sd==1)//sd equals 1
{
sf++;
onPaint(hdc);
InvalidateRect (hWnd, NULL, TRUE);// this should repaint the window but it doesn't
UpdateWindow(hWnd);
}
Run Code Online (Sandbox Code Playgroud)
提前谢谢拉米
我想将矩形的大小增加10像素.以下代码似乎无效.假设sampleRect是我的矩形.请告诉我.
Rectangle temp = new Rectangle(
sampleRect.X - 10,
sampleRect.Y - 10,
sampleRect.Width + 2*10,
sampleRect.Height + 2*10);
Run Code Online (Sandbox Code Playgroud) 如何清除矩形的填充?我只想保留边界.
g.FillRectangle(Brushes.Transparent, x, y, w, h);
Run Code Online (Sandbox Code Playgroud)
没有用,没有带有alpha的rGB,我想删除填充,所以只留下边框.
我试图DrawString()在面板(panel1)上使用方法绘制一个字符串.我想在form(Form1)加载时发生这种情况.但这不会发生.但是如果我在click事件处理程序中使用相同的代码(如下所示),则会绘制字符串panel1.我在哪里做错了?
private void Form1_Load(object sender, EventArgs e)
{
/*string rand = getRandomString();
textBox1.Text = rand;*/
string rand = "Hello";
SolidBrush sbr = new SolidBrush(Color.Black);
Graphics g = panel1.CreateGraphics();
FontFamily fam = new FontFamily("Magneto");
Font font = new System.Drawing.Font(fam, 24, FontStyle.Bold);
g.DrawString(rand, font, sbr, new Point(20, 20));
}
Run Code Online (Sandbox Code Playgroud) 根据MSDN:
如果nWidthSrc和nWidthDest参数的符号或者nHeightSrc和nHeightDest参数不同,StretchBlt将创建位图的镜像.
所以我尝试创建颠倒的图像.我有一个类看起来像这样:
class Picture
{
private:
HBITMAP bmp; //Bitmap
HDC pdc; //Device context
short int w; //Weidth of bitmap
short int h; //Heighth of bitmap
public:
short int x;
short int y;
void draw(HDC);
void upside_down();
}
Run Code Online (Sandbox Code Playgroud)
我有这个方法:
void Picture::upside_down()
{
HDC dc = CreateCompatibleDC(pdc);
HBITMAP bmap = CreateCompatibleBitmap(pdc, w, h);
SelectObject(dc, bmap);
BitBlt(dc, 0, 0, w, h, pdc, 0, 0, SRCCOPY);
StretchBlt(pdc, 0, 0, w, h, dc, 0, 0, w, -h, SRCCOPY);
DeleteDC(dc);
DeleteObject(bmap);
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,没有任何反应.我想知道它是否具有DC兼容性,我总是在理解其背后的逻辑时遇到问题.
那么,我应该怎么做才能让我的位图翻转?
我有两个游标资源。第一个[IDC_CURSOR1]包含三种不同的图像类型:
第二个[IDC_CURSOR2]仅包含一个:
如果我正在调用LoadCursor(hInst,IDC_CURSOR1),它将始终加载32x32版本,而我找不到加载48x48或64x64版本的方法。在第二种情况下,它会加载48x48图标(因为没有其他版本),但会将其缩小到32x32。
如何加载非32x32分辨率的游标?
顺便说一句:我试图更改DPI,因为根据msdn,它应该自动以更高的dpi加载更高分辨率的光标,但事实并非如此。
谢谢!
我在Windows 10上使用C ++进行编码-直接Win32 API。
我想在屏幕的右上方显示一个窗口。在执行此操作时,我注意到最大化窗口的屏幕坐标为left = -8,top = -8,right = 1936,bottom = 1088。
另外,当我将窗口的位置设置为right = 1920且top = 0时,右侧大约有8个像素的间隙。我尝试移动窗口以查看得到的屏幕坐标。
对于非最大化窗口的rect.left可以从-7到1912年。
所以东西滑了7个像素?WTF Microsoft?
我应该如何提出rec.right = 1913的值来将窗口对齐到屏幕右侧而没有悬空间隙?
但是1920年的rect.right留下了空白。所以1912年的rect.right将留下更多的空白...
我需要一种可以在Vista上运行的解决方案。在win10之前,rect.right应该像您期望的那样为1920。
Whaaaaat会在这里吗?我要开始扔刀了!
在代码方面,这正是GetWindowRect正在报告的内容...(对不起,我的调试功能很奇怪)
::GetWindowRect (_wndo, r);
DBG("ExtRc l=`d r=`d t=`d b=`d w=`d h=`d",
r->left, r->right, r->top, r->bottom, r->right-r->left, r->bottom-r->top);
Run Code Online (Sandbox Code Playgroud) gdi ×10
c# ×4
winapi ×4
.net ×3
c++ ×3
windows ×3
barcode ×1
bitmap ×1
c ×1
drawing ×1
graphics ×1
performance ×1
printing ×1
repaint ×1
stretchblt ×1
visual-c++ ×1
windows-10 ×1
winforms ×1