发新话题
打印

DPI问题大伙怎么解决的?

DPI问题大伙怎么解决的?

我是贴图弄的软件界面,如果不是96DPI显示,会有问题。

大牛们如何处理的啊?
What?

TOP

stretchdib
走别人的路,让别人无路可走

TOP

签名很靓

TOP

用StretchDIBits
StretchDIBits函数的功能是拷贝一个DIB中的某矩形区域中的像素的颜色数据到指定的矩形区域中,如果目的矩形区域的大小与源区域不相同,该函数会自动地进行伸展或压缩以使之适合显示。它的原型如下:

int StretchDIBits(
  HDC hdc,                      // 设备上下文句柄
  int XDest,                    // 目的区域左上角X轴坐标
  int YDest,                    // 目的区域左上角Y轴坐标
  int nDestWidth,               // 目的区域的宽度
  int nDestHeight,              // 目的区域的高度
  int XSrc,                     // 源区域左上角X轴坐标
  int YSrc,                     // 源区域左上角Y轴坐标
  int nSrcWidth,                // 源区域的宽度
  int nSrcHeight,               // 源区域的高度
  CONST VOID *lpBits,           // 指向位图的比特数据,即像素数据数组
  CONST BITMAPINFO *lpBitsInfo, // 位图头部信息的指针,包含了该DIB的信息
  UINT iUsage,                  // usage options
  DWORD dwRop                   // raster operation code
);

其中iUsage参数指定BITMAPINFO结构体中的bmiColors成员是否被提供,如果是的话,bmiColors是否包含了明确的RGB颜色还是颜色索引,如果该值指定为DIB_RGB_COLORS,则表示颜色表中包含的是明确的RGB颜色的值。

最后一个参数指定了源像素、目的设备上下文的当前画笔以及目的像素将以何种方式结合起来构成新的图像的表示。

下面是一个例子:

// TODO: Add your command handler code here
BOOL               bSuccess ;
DWORD              dwFileSize, dwHighSize, dwBytesRead ;
HANDLE             hFile ;
BITMAPFILEHEADER * pbmfh ;
BITMAPINFO       * pbmi ;
BYTE             * pBits ;
int                cxDib, cyDib ;

CString pstrFileName="c:\\mypic.bmp";

hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;

if (hFile == INVALID_HANDLE_VALUE)
return ;

dwFileSize = GetFileSize (hFile, &dwHighSize) ;

if (dwHighSize)
{
CloseHandle (hFile) ;
return ;
}

pbmfh = (BITMAPFILEHEADER *)malloc (dwFileSize) ;
if (!pbmfh)
{
CloseHandle (hFile) ;
return ;
}

bSuccess = ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ;
CloseHandle (hFile) ;
if (!bSuccess || (dwBytesRead != dwFileSize)         
|| (pbmfh->bfType != * (WORD *) "BM")  
|| (pbmfh->bfSize != dwFileSize))
{
free (pbmfh) ;
return  ;
}
this->Invalidate();

if (pbmfh == NULL)
{
MessageBox (TEXT ("Cannot load DIB file"),  
"ShowDIB", MB_ICONEXCLAMATION | MB_OK) ;
return ;
}
// 取得位图信息结构体的指针和位图数据数组的指针

pbmi  = (BITMAPINFO *) (pbmfh + 1) ;
pBits = (BYTE *) pbmfh + pbmfh->bfOffBits ;

// Get the DIB width and height

if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER))
{
cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ;
}
else
{
cxDib =      pbmi->bmiHeader.biWidth ;
cyDib = abs (pbmi->bmiHeader.biHeight) ;
}

PAINTSTRUCT               ps ;
HDC hdc = hdc = ::BeginPaint (this->GetSafeHwnd(), &ps) ;

CRect winrect;
this->GetClientRect(&winrect);
StretchDIBits (hdc, 0, 0, winrect.Width(), winrect.Height(),  
0, 0, cxDib, cyDib,
pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
::EndPaint (this->GetSafeHwnd(), &ps) ;
...............................

TOP

我的也有问题,怎么编程判断当前的DPI?

TOP

DPI不设为96的用户有多少,我的软件在非96的情况下,贴图拉伸后不好看。

TOP

可以直接获取DPI呀,有这个函数,忘记了,前几天还搞过来着呢。
...............................

TOP

gdi+

TOP

Delphi Screen.PixelsPerInch
超级简单易用的音视频转换组件 支持RMVB解码 FFmpeg for Delphi / VB http://www.CCAVC.com

TOP

var
  DC: HDC;
  FPixelsPerInch: Integer;

  DC := GetDC(0);
  FPixelsPerInch := GetDeviceCaps(DC, LOGPIXELSY);
  ReleaseDC(0, DC);
超级简单易用的音视频转换组件 支持RMVB解码 FFmpeg for Delphi / VB http://www.CCAVC.com

TOP

发新话题