/Q//
현재 시스템 사양이 16비트 이상인지 알아내려고 합니다.
/A//
윈도우 시스템에서 사용가능한 총 컬러수를 알아내려면 API함수 GetDeviceCaps()를
사용하면 되구요, 이 함수의 프로토타입은 다음과 같습니다.
int GetDeviceCaps(HDC hdc, int nIndex);
첫 인자로 dc를 하나 넘겨주구요, 두번째 인자로서는 알아내려는 정보에 따라 여러
지 인덱스를 넘겨줍니다. 원하시는 것처럼 시스템 컬러수를 알아내려면 먼저 플레인
의 수를 알아내고, 다음에 픽셀당 비트수를 알아내서 곱해준후, 1을 왼쪽으로 그 수
만큼 시프트 해주면 됩니다. 코딩은,
(컬러수) = 1 << (GetDeviceCaps(dc, PLANES) * GetDeviceCaps(dc, BITSPIXEL));
와 같습니다. 단지 몇비트 컬러인지만 알고 싶다면 시프트 할 필요도 없이
GetDeviceCaps(dc, PLANES) * GetDeviceCaps(dc, BITSPIXEL);
해주면 16비트 컬러라면 16이 리턴되고, 256 컬러라면 8이 리턴됩니다.
그럼, 도움되시길 바라구요, 이만...
(참... 물론 dc는 GetDC()등의 함수로 미리 구해둬야 겠죠~ 아무거나 상관없구요,
현재 폼의 핸들로부터 dc를 구하거나 Canvas->Handle로 구하면 젤 쉽겠네요~)
/A//
API함수 중에 EnumDisplaySettings()라는 함수가 있습니다. 이것은 디스플레이
장치의 그래픽 모드들의 정보를 얻어오는 함수입니다.
도움말에서 함수의 원형을 보면 다음과 같습니다.
BOOL EnumDisplaySettings(
LPCTSTR lpszDeviceName, // specifies the display device
DWORD iModeNum, // specifies the graphics mode
LPDEVMODE lpDevMode // points to structure to receive settings
);
각 인자의 자세한 설명은 도움말을 보시고요.
다음 예제를 보세요.
procedure TForm1.Button1Click(Sender: TObject);
var
DMode: TDevMode;
ModeNumber: Integer;
begin
ModeNumber := 0;
while EnumDisplaySettings(nil, ModeNumber, DMode) do
begin
if (Screen.Width = DMode.dmPelsWidth) then
ShowMessage(IntToStr(DMode.dmBitsPerPel)+' 비트컬러 사용 가능');
Inc(ModeNumber);
end;
end;
이 예제는 EnumDisplaySettings()를 이용해서 현재 시스템에서 사용할 수 있는
모든 해상도의 모든 컬러를 얻어옵니다. (While문에서...)
그리고 현재 해상도에서 가능한 컬러수를 ShowMessage()로 출력합니다.
실행해 보시면 이해가 가실겁니다. 응용하시면 될 것 같군요.
|