2010-01-21 86 views
1

我使用ExtCreatePen API爲自定義模式筆創建了DIBPATTERN筆。ExtCreatePen和Windows 7 GDI

它成功地借鑑了Windows XP中所需的行,

但在Windows 7(64位我的情況),它不作出任何線;屏幕上沒有改變。

(其它簡單地創作筆,例如個CreatePen(PS_DOT,1,0),正在努力。)

我發現打電話SetROP2(HDC,R2_XORPEN)作出如下畫線API調用畫點什麼,但與異或操作。我不想XOR繪圖。

這是我創建筆的代碼。它在Windows XP上沒有問題:

LOGBRUSH lb; 
lb.lbStyle = BS_DIBPATTERN; 
lb.lbColor = DIB_RGB_COLORS; 
int cb = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 2 + 8*4; 
HGLOBAL hg = GlobalAlloc(GMEM_MOVEABLE, cb);     
BITMAPINFO* pbmi = (BITMAPINFO*) GlobalLock(hg); 
ZeroMemory(pbmi, cb); 
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
pbmi->bmiHeader.biWidth = 8; 
pbmi->bmiHeader.biHeight = 8; 
pbmi->bmiHeader.biPlanes = 1; 
pbmi->bmiHeader.biBitCount = 1; 
pbmi->bmiHeader.biCompression = BI_RGB; 
pbmi->bmiHeader.biSizeImage = 8; 
pbmi->bmiHeader.biClrUsed = 2; 
pbmi->bmiHeader.biClrImportant = 2; 
pbmi->bmiColors[1].rgbBlue = 
pbmi->bmiColors[1].rgbGreen = 
pbmi->bmiColors[1].rgbRed = 0xFF; 
DWORD* p = (DWORD*) &pbmi->bmiColors[2]; 
for(int k=0; k<8; k++) *p++ = patterns[k]; 
GlobalUnlock(hg); 
lb.lbHatch = (LONG) hg; 
s_aSelectionPens[i] = ExtCreatePen(PS_GEOMETRIC, 1, &lb, 0, NULL); 
ASSERT(s_aSelectionPens[i]); // success on both XP and Win7 
GlobalFree(hg); 

它只在我的電腦上出現問題嗎?請檢查這個問題。 謝謝。

回答

0

我承認,我是半信半疑的第一次,但我編譯和運行您的程序,並確實未按照規定提取在Windows 7上的第二行,只買在航空模式

通過切換到Windows基本或經典模式下,所有四行都按預期繪製。

我只能假設這是某種與自定義筆的不良交互以及航空模式實現GDI調用的新方式。這似乎可能是一個微軟的bug,也許你可以在他們的留言板上發佈這個問題?

0

因此,您將創建一個8x8黑/白(單色)位圖作爲DIB,然後使用它創建一支筆。我看到這段代碼沒有錯。這絕對看起來像一個Windows錯誤,但可能有一個解決方法。

嘗試設置

pbmi->bmiHeader.biClrUsed = 0; 
pbmi->bmiHeader.biClrImportant = 0; 

在這種情況下,值設置爲0 應該意味着同樣的事情,將它們設置爲2,而0是,你必須使用完整的情況下,更規範的行爲調色板。您的調色板中仍然需要兩個條目,0表示「基於biBitCount的全尺寸」。

另外,每個調色板的使用都是RGBQUAD,這意味着有空間存放alpha,並且您的alpha設置爲0,其中應該應該被忽略,但也許不是。所以請嘗試將兩個調色板條目的高字節設置爲0xFF或0x80。

最後,您的調色板可能會被完全忽略,並且Windows正在使用目標DC的BkMode,BkColor和TextColor來處理所有事情,因此您需要確保將它們設置爲可以看到的值。

我的猜測是,這與alpha透明度有關,因爲GDI完全忽略alpha,但Aero沒有。