我这样写image1 怎么不会显示图啊(90分)

  • 主题发起人 主题发起人 zhouxiangjun
  • 开始时间 开始时间
你有 loadbitmap VC 的函数的源码吗?改写成 DLL,然后在 Delphi 中调用就可以了。
 
[:(][8D][:D][:)][:(!]
 
Windows 的资源文件

不管在Dos下编程还是在Windows下编程,我们总是要用到除了可执行文件外的很多其他数据,如声音数据,图形数据,文本等等,在Dos下编程,我们可以自己定义这些文件的格式,但这样一来就造成了很多资源共享的问题,大家可能还记的Dos下的很多游戏,它们的图形都是按自己的格式存放的,你无法用标准的看图软件来看。也无法把它另存为其他格式。虽然在Win32编程中,我们仍然可以这样做,但Win32编程给了我们一个方案 ---- 就是格式统一的资源文件,把字符串、图形、对话框包括上面的按钮,文本等定义到一个资源文件中,就可以方便的在不同的文件中使用它,最重要的是,如果我们用自己的文件格式,使用时就要涉及到这些文件的读写操作,比较复杂,但使用资源文件时,Windows提供了一系列的API来装入资源。非常方便。现在,让我们来看一个很简单的资源文件的源文件,它的扩展名是 .rc,当它用资源编译器编译以后产生 .res 文件就可以在 link的时候连入.exe 文件中:
 
继续啊! 朋友们
继续啊! 朋友们
 
zhouxiangjun:
pap 文件事什么格式的文件, 我真的是孤陋寡闻。
 
TO: xuxiaohan
自定的图像文件格式
你如果写一个画图的程序,我想你也可以把它定义自已的文件格式吧
 
loadbitmap不能说明它就是bmp格式,你应该用ACDSee能打开,至少能看到再说,另外ACDSee能打开,delphi也未必显示出来,例如有些jpg就显示不出来,网上有些图像扩展控件,可以让delphi打开多种格式的图像,但我从来没听说过pap。
 
BOOL LoadBmpFile(HWND hWnd,char *BmpFileName)
{
HFILE hf;
LPBITMAPINFOHEADER lpImgData;
LOGPALETTE *pPal;
LPRGBQUAD lpRGB;
HPALETTE hPrevPalette;
HDC hDc;
HLOCAL hPal;
DWORD ImgSize;
DWORD i;
if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR){
MessageBox(hWnd,"File c://test.bmp not found!","Error Message",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
_lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER));
_lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER));
ImgWidth=bi.biWidth;
ImgHeight=bi.biHeight;
LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);
ImgSize=(DWORD)LineBytes*bi.biHeight;
if(bi.biClrUsed!=0)
NumColors=(DWORD)bi.biClrUsed;
else
switch(bi.biBitCount){
case 1:
NumColors=2;
break;
case 4:
NumColors=16;
break;
case 8:
NumColors=256;
break

case 24:
NumColors=0;
break;
default:
MessageBox(hWnd,"Invalid color numbers!","Error Message",MB_OK|MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
if(bf.bfOffBits!=(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)))
{
MessageBox(hWnd,"Invalid color numbers!","Error Message" ,MB_OK|
MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}
bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;
if((hImgData=GlobalAlloc(GHND,(DWORD)(sizeof(BITMAPINFOHEADER)+
NumColors*sizeof(RGBQUAD)+ImgSize)))==NULL)
{
MessageBox(hWnd,"Error alloc memory!","ErrorMessage",MB_OK|
MB_ICONEXCLAMATION);
_lclose(hf);
return FALSE;
}

lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);
_llseek(hf,sizeof(BITMAPFILEHEADER),FILE_BEGIN);
_hread(hf,(char *)lpImgData,(long)sizeof(BITMAPINFOHEADER)
+(long)NumColors*sizeof(RGBQUAD)+ImgSize);
_lclose(hf);
if(NumColors!=0)
{
hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + NumColors* sizeof(PALETTEENTRY));
pPal =(LOGPALETTE *)LocalLock(hPal);
pPal->palNumEntries =(WORD) NumColors;
pPal->palVersion = 0x300;
lpRGB = (LPRGBQUAD)((LPSTR)lpImgData + (DWORD)sizeof(BITMAPINFOHEADER));
for (i = 0; i < NumColors; i++) {
pPal->palPalEntry.peRed=lpRGB->rgbRed;
pPal->palPalEntry.peGreen=lpRGB->rgbGreen;
pPal->palPalEntry.peBlue=lpRGB->rgbBlue;
pPal->palPalEntry.peFlags=(BYTE)0;
lpRGB++;
}
hPalette=CreatePalette(pPal);
LocalUnlock(hPal);
LocalFree(hPal);
}
hDc=GetDC(hWnd);
if(hPalette){
hPrevPalette=SelectPalette(hDc,hPalette,FALSE);
RealizePalette(hDc);
}
hBitmap=CreateDIBitmap(hDc,(LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT,
(LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD),
(LPBITMAPINFO)lpImgData, DIB_RGB_COLORS);
if(hPalette && hPrevPalette){
SelectPalette(hDc,hPrevPalette,FALSE);
RealizePalette(hDc); }
ReleaseDC(hWnd,hDc);
GlobalUnlock(hImgData);
return TRUE;
}
 
大家帮个忙啊,把上面的代码给我转成Delphi 的吧
 
function TForm1.LoadBmpFile(hWnd:HWND;BmpFileName:Pchar):Boolean;
var
hf :HFILE;
lpImgData :^BITMAPINFOHEADER;
pPal :^LOGPALETTE;
// pPal :^TMaxLogPalette ;
lpRGB :^RGBQUAD;
Bits: Pointer;
hPrevPalette : HPALETTE;
hDc1, hMemDC : HDC;
hPal :HLOCAL;
LineBytes :DWORD;
ImgSize :DWORD;
NumColors :DWORD;
i :DWORD;
temp1 :DWORD;
temp2 :DWORD;
begin
hf:=_lopen(BmpFileName,OF_READ);
if hf=HFILE_ERROR then
begin
windows.MessageBox(hWnd,'File Can not Open','Error Message',
MB_OK+MB_ICONEXCLAMATION);
result := False;
end;
// windows._lread(hf,@bf,Sizeof(BITMAPFILEHEADER));
_lread(hf,@bf,Sizeof(BITMAPFILEHEADER));
_lread(hf,@bi,Sizeof(BITMAPINFOHEADER));
// LineBytes:=((bi.biWidth*bi.biBitCount+31)div 32*4);
LineBytes:=(bi.biWidth*bi.biBitCount);
ImgSize:=LineBytes*bi.biHeight;
if bi.biClrUsed<> 0 then
NumColors:=bi.biClrused
else
begin
Case bi.biBitCount of
1: NumColors:=2;
4: NumColors:=16;
8: NumColors:=256;
24: NumColors:=0;
else
begin
windows.MessageBox(hWnd,'Invalid color Numbers !',
'Error Message',
MB_OK+MB_ICONEXCLAMATION);
_lclose(hf);
Result:= False;
end; //else;
end; //case;
end;
if bf.bfOffBits<>(NumColors*Sizeof(TRGBQUAD)+sizeof(BITMAPFILEHEADER)+
sizeof(BITMAPINFOHEADER)) then
begin
windows.MessageBox(hWnd,'Invalid color numbers!','Error Message',MB_OK+MB_ICONEXCLAMATION);
windows._lclose(hf);
Result:=False;
end;
bf.bfSize:=Sizeof(BITMAPFILEHEADER)+Sizeof(BITMAPINFOHEADER)+
NumColors*Sizeof(RGBQUAD)+ImgSize;

hImgData:=GlobalAlloc(GHND,Sizeof(BITMAPINFOHEADER)+NumColors*Sizeof(RGBQUAD)+ImgSize);
if hImgData=0 then
begin
//分配内存错误
Windows.MessageBox(hWnd,'Error alloc memory!','ErrorMessage',MB_OK+MB_ICONEXCLAMATION);
windows._lclose(hf);
Result:=False;
end;
lpImgData:=(GlobalLock(hImgData));
windows._llseek(hf,Sizeof(BITMAPFILEHEADER),FILE_BEGIN);
windows._lread(hf,lpImgData,sizeof(BITMAPINFOHEADER)+NumColors*Sizeof(RGBQUAD)+ImgSize);
windows._lclose(hf);
if NumColors<>0 then
begin
hPal:=LocalAlloc(LHND,sizeof(LOGPALETTE)+NumColors*sizeof(PALETTEENTRY));
pPal:=LocalLock(hPal);
pPal^.palNumEntries:=NumColors;
pPal^.palVersion:=$300;
lpRGB:=Pointer(LPSTR(lpImgData)+sizeof(BITMAPINFOHEADER));
for i:=0 to NumColors-1 do
begin
pPal^.palPalEntry.peRed:=lpRGB.rgbRed;
pPal^.palPalEntry.peGreen:=lpRGB.rgbGreen;
pPal^.palPalEntry.peBlue:=lpRGB.rgbBlue;
pPal^.palPalEntry.peFlags:=0;
lpRGB:=Pointer(LPSTR(lpRGB)+sizeof(TRGBQUAD));
end;
hPalette1:=CreatePalette(PLogPalette(pPal)^);
LocalUnlock(hPal);
LocalFree(hPal);
end;
hDc1:=GetDC(0);
if hPalette1 <> 0 then
begin
hPrevPalette:=SelectPalette(hDC1,hPalette1,FALSE);
RealizePalette(hDC1);
end;
hBmp:=CreateDIBitmap(hDc1,
PBitmapInfoHeader(lpImgData)^,
LONGWORD(CBM_INIT),
LPSTR(lpImgData)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD),
PBitmapInfo(@bi)^,
DIB_RGB_COLORS);
if (hPalette1<>0 )and (hPrevPalette<> 0 ) then
begin
SelectPalette(hDc1,hPrevPalette,FALSE);
RealizePalette(hDc1);
end;
ReleaseDC(0,hDc1);
GlobalUnlock(hImgData);
Result:=True;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
hDc2, hMemDC : Integer;
hPrevPalette :hPalette;
begin
hDC2:=GetDC(form1.WindowHandle);
if hBmp<> 0 then
begin
hMemDC:=CreatecompatibleDC(hDC2);
if hPalette1 <>0 then
begin
hPrevPalette:=SelectPalette(hDC2,hPalette1,False);
SelectPalette(hMemDC,hPalette1,False);
RealizePalette(hDC2);
end;
SelectObject(hMemDC,hBmp);

BitBlt(hDC2,0,0,bi.biWidth,bi.biHeight,hMemDC,0,0,SRCCOPY);
DeleteDC(hMemDC);
end;
if (hPalette1<>0 )and (hPrevPalette<> 0 ) then
begin
SelectPalette(hDc2,hPrevPalette,FALSE);
RealizePalette(hDc2);
end;
ReleaseDC(form1.WindowHandle,hdc2);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if hBmp<>0 then
DeleteObject(hBmp);
if hPalette1<> 0 then
DeleteObject(hPalette1);
if hImgData<>0 then
begin
GlobalUnlock(hImgData);
GlobalFree(hImgData);
end;



这样对不对啊
 
zhouxiangjun:
既然是自定义的图形格式,如果你不知道格式,你是打不开的。
用 loadBitMap 是没有用的。
 
在USES加上你要用的图片的格式,再用你原来写的代码就可以的
上面说我感觉都很复杂的/
 

Similar threads

I
回复
0
查看
636
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部