问题描述
我尝试编写一些代码,这些代码负责在打印机上下文设备上绘制信号。 在VS2013中为WindCE 2013创建了应用程序。 这是创建DC的方法:
extern TCHAR DriverName[256];
extern TCHAR DeviceName[256];
extern TCHAR OutputName[256];
ZeroMemory(&psd,sizeof(psd));
psd.lStructSize = sizeof(psd);
psd.hwndOwner = hWnd;
psd.hDevMode = NULL; // Don't forget to free or store hDevMode.
psd.hDevNames = NULL; // Don't forget to free or store hDevNames.
psd.Flags = PSD_INTHOUSANDTHSOFINCHES | PSD_MARGINS;
psd.rtMargin.top = 1000;
psd.rtMargin.left = 1250;
psd.rtMargin.right = 1250;
psd.rtMargin.bottom = 1000;
if (PageSetupDlg(&psd) == TRUE)
{
memcpy(&dm,(DEVMODE *)(psd.hDevMode),sizeof(DEVMODE));
lstrcpy(DriverName,((TCHAR *)((BYTE *)psd.hDevNames + ((DEVNAMES *)psd.hDevNames)->wDriverOffset)));
lstrcpy(DeviceName,((TCHAR *)((BYTE *)psd.hDevNames + ((DEVNAMES *)psd.hDevNames)->wDeviceOffset)));
lstrcpy(OutputName,((TCHAR *)((BYTE *)psd.hDevNames + ((DEVNAMES *)psd.hDevNames)->wOutputOffset)));
hDC = CreateDC(DriverName,DeviceName,OutputName,&dm);
}
return TRUE;
我在循环中绘制了每个点,但是有一个问题,因为如果我不使用ReleaseDC()或DeleteDC()函数,则执行会花费很长时间。内存已满,绘制新点非常慢。 通过在循环的GetDC()函数的开头和其末尾的ReleaseDC()的位置,我很容易地解决了显示上下文的问题。 (下面的代码)
for (int k = 0,offset = 40; k <= kanal; k++,offset += 33)
{
float czasy[12];
int i = 1;
int j = 1;
HPEN CzerwonePioro,Pudelko;
POINT stary;
do
{
hDC = GetDC(hWnd);
//hDC = CDC;
int x,y1,y2;
float speed = 0.22;
int test = memECG[1][i];
DWORD error;
CzerwonePioro = CreatePen(PS_SOLID,2,0x000000);
Pudelko = (HPEN)SelectObject(hDC,CzerwonePioro);
//y2 = tab[i - 1];
MovetoEx(hDC,speed*j,offset - 0.02*memECG[k][i - 1],NULL);
Lineto(hDC,speed*j + 1,offset - 0.02*memECG[k][i]);
SelectObject(hDC,Pudelko);
i++;
j += 1;
ReleaseDC(hWnd,hDC);
} while (i < 1000);
}
对于打印机,我尝试在功能中使用GetCompatibleDC或CreateDC,但是它不起作用。 您是否知道如何释放打印机DC,并在下一次迭代中使用相同的DC(以确保时间和内存安全)?
解决方法
内存已满,绘制新点非常慢。
您可以在while循环中使用CreatePen
来连续创建GDI对象,并且在使用后不使用CreatePen
来销毁这些对象。这将导致内存泄漏,并且如果创建了足够的GDI对象,它将占用内存并影响程序的效率。
您是否知道如何释放打印机DC并在下一次迭代中使用 相同的DC(出于时间和存储安全的考虑)?
您不需要重复创建DC,只需要使用CreateDC
一次创建设备上下文,就可以在其中绘制所需的内容。
修改后的代码:
extern TCHAR DriverName[256];
extern TCHAR DeviceName[256];
extern TCHAR OutputName[256];
ZeroMemory(&psd,sizeof(psd));
psd.lStructSize = sizeof(psd);
psd.hwndOwner = hWnd;
psd.hDevMode = NULL; // Don't forget to free or store hDevMode.
psd.hDevNames = NULL; // Don't forget to free or store hDevNames.
psd.Flags = PSD_INTHOUSANDTHSOFINCHES | PSD_MARGINS;
psd.rtMargin.top = 1000;
psd.rtMargin.left = 1250;
psd.rtMargin.right = 1250;
psd.rtMargin.bottom = 1000;
if (PageSetupDlg(&psd) == TRUE)
{
memcpy(&dm,(DEVMODE *)(psd.hDevMode),sizeof(DEVMODE));
lstrcpy(DriverName,((TCHAR *)((BYTE *)psd.hDevNames + ((DEVNAMES *)psd.hDevNames)->wDriverOffset)));
lstrcpy(DeviceName,((TCHAR *)((BYTE *)psd.hDevNames + ((DEVNAMES *)psd.hDevNames)->wDeviceOffset)));
lstrcpy(OutputName,((TCHAR *)((BYTE *)psd.hDevNames + ((DEVNAMES *)psd.hDevNames)->wOutputOffset)));
hDC = CreateDC(DriverName,DeviceName,OutputName,&dm);
...
int x,y1,y2;
float speed = 0.22;
int test = memECG[1][i];
DWORD error;
float czasy[12];
int i = 1;
int j = 1;
HPEN CzerwonePioro,Pudelko;
POINT stary;
CzerwonePioro = CreatePen(PS_SOLID,2,0x000000);
Pudelko = (HPEN)SelectObject(hDC,CzerwonePioro);
for (int k = 0,offset = 40; k <= kanal; k++,offset += 33)
{
do
{
MoveToEx(hDC,speed*j,offset - 0.02*memECG[k][i - 1],NULL);
LineTo(hDC,speed*j + 1,offset - 0.02*memECG[k][i]);
i++;
j += 1;
} while (i < 1000);
}
SelectObject(hDC,Pudelko);
DeleteObject(CzerwonePioro);
ReleaseDC(hWnd,hDC);
}
return TRUE;