设备上下文是打印机时,GetDC函数的等效功能是什么

问题描述

我尝试编写一些代码,这些代码负责在打印机上下文设备上绘制信号。 在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;