aboutsummaryrefslogtreecommitdiffhomepage
path: root/win32/PlatWin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'win32/PlatWin.cxx')
-rw-r--r--win32/PlatWin.cxx266
1 files changed, 125 insertions, 141 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index b9164c757..6a6c38029 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -11,6 +11,12 @@
#include <stdarg.h>
#include <stdio.h>
+#define _WIN32_WINNT 0x0400
+#include <windows.h>
+#undef DrawText
+#include <commctrl.h>
+#include <richedit.h>
+
#include "Platform.h"
#include "PlatformRes.h"
#include "UniConversion.h"
@@ -24,34 +30,6 @@ static RECT RectFromPRectangle(PRectangle prc) {
return rc;
}
-Colour::Colour(long lcol) {
- co = lcol;
-}
-
-Colour::Colour(unsigned int red, unsigned int green, unsigned int blue) {
- co = RGB(red, green, blue);
-}
-
-bool Colour::operator==(const Colour &other) const {
- return co == other.co;
-}
-
-long Colour::AsLong() const {
- return co;
-}
-
-unsigned int Colour::GetRed() {
- return co & 0xff;
-}
-
-unsigned int Colour::GetGreen() {
- return (co >> 8) & 0xff;
-}
-
-unsigned int Colour::GetBlue() {
- return (co >> 16) & 0xff;
-}
-
Palette::Palette() {
used = 0;
allowRealization = false;
@@ -83,7 +61,7 @@ void Palette::WantFind(ColourPair &cp, bool want) {
if (used < numEntries) {
entries[used].desired = cp.desired;
- entries[used].allocated = cp.desired;
+ entries[used].allocated.Set(cp.desired.AsLong());
used++;
}
} else {
@@ -93,7 +71,7 @@ void Palette::WantFind(ColourPair &cp, bool want) {
return;
}
}
- cp.allocated = cp.desired;
+ cp.allocated.Set(cp.desired.AsLong());
}
}
@@ -108,12 +86,12 @@ void Palette::Allocate(Window &) {
logpal->palVersion = 0x300;
logpal->palNumEntries = static_cast<WORD>(used);
for (int iPal=0;iPal<used;iPal++) {
- Colour desired = entries[iPal].desired;
+ ColourDesired desired = entries[iPal].desired;
logpal->palPalEntry[iPal].peRed = static_cast<BYTE>(desired.GetRed());
logpal->palPalEntry[iPal].peGreen = static_cast<BYTE>(desired.GetGreen());
logpal->palPalEntry[iPal].peBlue = static_cast<BYTE>(desired.GetBlue());
- entries[iPal].allocated =
- PALETTERGB(desired.GetRed(), desired.GetGreen(), desired.GetBlue());
+ entries[iPal].allocated.Set(
+ PALETTERGB(desired.GetRed(), desired.GetGreen(), desired.GetBlue()));
// PC_NOCOLLAPSE means exact colours allocated even when in background this means other windows
// are less likely to get their colours and also flashes more when switching windows
logpal->palPalEntry[iPal].peFlags = PC_NOCOLLAPSE;
@@ -273,36 +251,37 @@ Surface::~Surface() {
void Surface::Release() {
if (penOld) {
- ::SelectObject(hdc, penOld);
+ ::SelectObject(reinterpret_cast<HDC>(hdc), penOld);
::DeleteObject(pen);
penOld = 0;
}
pen = 0;
if (brushOld) {
- ::SelectObject(hdc, brushOld);
+ ::SelectObject(reinterpret_cast<HDC>(hdc), brushOld);
::DeleteObject(brush);
brushOld = 0;
}
brush = 0;
if (fontOld) {
// Fonts are not deleted as they are owned by a Font object
- ::SelectObject(hdc, fontOld);
+ ::SelectObject(reinterpret_cast<HDC>(hdc), fontOld);
fontOld = 0;
}
font =0;
if (bitmapOld) {
- ::SelectObject(hdc, bitmapOld);
+ ::SelectObject(reinterpret_cast<HDC>(hdc), bitmapOld);
::DeleteObject(bitmap);
bitmapOld = 0;
}
bitmap = 0;
if (paletteOld) {
// Fonts are not deleted as they are owned by a Palette object
- ::SelectPalette(hdc, paletteOld, TRUE);
+ ::SelectPalette(reinterpret_cast<HDC>(hdc),
+ reinterpret_cast<HPALETTE>(paletteOld), TRUE);
paletteOld = 0;
}
if (hdcOwned) {
- ::DeleteDC(hdc);
+ ::DeleteDC(reinterpret_cast<HDC>(hdc));
hdc = 0;
hdcOwned = false;
}
@@ -316,61 +295,61 @@ void Surface::Init() {
Release();
hdc = ::CreateCompatibleDC(NULL);
hdcOwned = true;
- ::SetTextAlign(hdc, TA_BASELINE);
+ ::SetTextAlign(reinterpret_cast<HDC>(hdc), TA_BASELINE);
}
void Surface::Init(SurfaceID sid) {
Release();
hdc = sid;
- ::SetTextAlign(hdc, TA_BASELINE);
+ ::SetTextAlign(reinterpret_cast<HDC>(hdc), TA_BASELINE);
}
void Surface::InitPixMap(int width, int height, Surface *surface_) {
Release();
- hdc = ::CreateCompatibleDC(surface_->hdc);
+ hdc = ::CreateCompatibleDC(reinterpret_cast<HDC>(surface_->hdc));
hdcOwned = true;
- bitmap = ::CreateCompatibleBitmap(surface_->hdc, width, height);
- bitmapOld = static_cast<HBITMAP>(::SelectObject(hdc, bitmap));
- ::SetTextAlign(hdc, TA_BASELINE);
+ bitmap = ::CreateCompatibleBitmap(reinterpret_cast<HDC>(surface_->hdc), width, height);
+ bitmapOld = static_cast<HBITMAP>(::SelectObject(reinterpret_cast<HDC>(hdc), bitmap));
+ ::SetTextAlign(reinterpret_cast<HDC>(hdc), TA_BASELINE);
}
-void Surface::PenColour(Colour fore) {
+void Surface::PenColour(ColourAllocated fore) {
if (pen) {
- ::SelectObject(hdc, penOld);
+ ::SelectObject(reinterpret_cast<HDC>(hdc), penOld);
::DeleteObject(pen);
pen = 0;
penOld = 0;
}
pen = ::CreatePen(0,1,fore.AsLong());
- penOld = static_cast<HPEN>(::SelectObject(hdc, pen));
+ penOld = static_cast<HPEN>(::SelectObject(reinterpret_cast<HDC>(hdc), pen));
}
-void Surface::BrushColor(Colour back) {
+void Surface::BrushColor(ColourAllocated back) {
if (brush) {
- ::SelectObject(hdc, brushOld);
+ ::SelectObject(reinterpret_cast<HDC>(hdc), brushOld);
::DeleteObject(brush);
brush = 0;
brushOld = 0;
}
// Only ever want pure, non-dithered brushes
- Colour colourNearest = ::GetNearestColor(hdc, back.AsLong());
+ ColourAllocated colourNearest = ::GetNearestColor(reinterpret_cast<HDC>(hdc), back.AsLong());
brush = ::CreateSolidBrush(colourNearest.AsLong());
- brushOld = static_cast<HBRUSH>(::SelectObject(hdc, brush));
+ brushOld = static_cast<HBRUSH>(::SelectObject(reinterpret_cast<HDC>(hdc), brush));
}
void Surface::SetFont(Font &font_) {
if (font_.GetID() != font) {
if (fontOld) {
- ::SelectObject(hdc, font_.GetID());
+ ::SelectObject(reinterpret_cast<HDC>(hdc), font_.GetID());
} else {
- fontOld = static_cast<HFONT>(::SelectObject(hdc, font_.GetID()));
+ fontOld = static_cast<HFONT>(::SelectObject(reinterpret_cast<HDC>(hdc), font_.GetID()));
}
font = font_.GetID();
}
}
int Surface::LogPixelsY() {
- return ::GetDeviceCaps(hdc, LOGPIXELSY);
+ return ::GetDeviceCaps(reinterpret_cast<HDC>(hdc), LOGPIXELSY);
}
int Surface::DeviceHeightFont(int points) {
@@ -378,93 +357,96 @@ int Surface::DeviceHeightFont(int points) {
}
void Surface::MoveTo(int x_, int y_) {
- ::MoveToEx(hdc, x_, y_, 0);
+ ::MoveToEx(reinterpret_cast<HDC>(hdc), x_, y_, 0);
}
void Surface::LineTo(int x_, int y_) {
- ::LineTo(hdc, x_, y_);
+ ::LineTo(reinterpret_cast<HDC>(hdc), x_, y_);
}
-void Surface::Polygon(Point *pts, int npts, Colour fore, Colour back) {
+void Surface::Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back) {
PenColour(fore);
BrushColor(back);
- ::Polygon(hdc, reinterpret_cast<POINT *>(pts), npts);
+ ::Polygon(reinterpret_cast<HDC>(hdc), reinterpret_cast<POINT *>(pts), npts);
}
-void Surface::RectangleDraw(PRectangle rc, Colour fore, Colour back) {
+void Surface::RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back) {
PenColour(fore);
BrushColor(back);
- ::Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
+ ::Rectangle(reinterpret_cast<HDC>(hdc), rc.left, rc.top, rc.right, rc.bottom);
}
-void Surface::FillRectangle(PRectangle rc, Colour back) {
+void Surface::FillRectangle(PRectangle rc, ColourAllocated back) {
// Using ExtTextOut rather than a FillRect ensures that no dithering occurs.
// There is no need to allocate a brush either.
RECT rcw = RectFromPRectangle(rc);
- ::SetBkColor(hdc, back.AsLong());
- ::ExtTextOut(hdc, rc.left, rc.top, ETO_OPAQUE, &rcw, "", 0, NULL);
+ ::SetBkColor(reinterpret_cast<HDC>(hdc), back.AsLong());
+ ::ExtTextOut(reinterpret_cast<HDC>(hdc), rc.left, rc.top, ETO_OPAQUE, &rcw, "", 0, NULL);
}
void Surface::FillRectangle(PRectangle rc, Surface &surfacePattern) {
HBRUSH br;
if (surfacePattern.bitmap)
- br = ::CreatePatternBrush(surfacePattern.bitmap);
+ br = ::CreatePatternBrush(reinterpret_cast<HBITMAP>(surfacePattern.bitmap));
else // Something is wrong so display in red
br = ::CreateSolidBrush(RGB(0xff, 0, 0));
RECT rcw = RectFromPRectangle(rc);
- ::FillRect(hdc, &rcw, br);
+ ::FillRect(reinterpret_cast<HDC>(hdc), &rcw, br);
::DeleteObject(br);
}
-void Surface::RoundedRectangle(PRectangle rc, Colour fore, Colour back) {
+void Surface::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back) {
PenColour(fore);
BrushColor(back);
- ::RoundRect(hdc,
+ ::RoundRect(reinterpret_cast<HDC>(hdc),
rc.left + 1, rc.top,
rc.right - 1, rc.bottom,
8, 8 );
}
-void Surface::Ellipse(PRectangle rc, Colour fore, Colour back) {
+void Surface::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) {
PenColour(fore);
BrushColor(back);
- ::Ellipse(hdc, rc.left, rc.top, rc.right, rc.bottom);
+ ::Ellipse(reinterpret_cast<HDC>(hdc), rc.left, rc.top, rc.right, rc.bottom);
}
void Surface::Copy(PRectangle rc, Point from, Surface &surfaceSource) {
- ::BitBlt(hdc, rc.left, rc.top, rc.Width(), rc.Height(),
- surfaceSource.hdc, from.x, from.y, SRCCOPY);
+ ::BitBlt(reinterpret_cast<HDC>(hdc),
+ rc.left, rc.top, rc.Width(), rc.Height(),
+ reinterpret_cast<HDC>(surfaceSource.hdc), from.x, from.y, SRCCOPY);
}
#define MAX_US_LEN 5000
-void Surface::DrawText(PRectangle rc, Font &font_, int ybase, const char *s, int len, Colour fore, Colour back) {
+void Surface::DrawText(PRectangle rc, Font &font_, int ybase, const char *s, int len,
+ ColourAllocated fore, ColourAllocated back) {
SetFont(font_);
- ::SetTextColor(hdc, fore.AsLong());
- ::SetBkColor(hdc, back.AsLong());
+ ::SetTextColor(reinterpret_cast<HDC>(hdc), fore.AsLong());
+ ::SetBkColor(reinterpret_cast<HDC>(hdc), back.AsLong());
RECT rcw = RectFromPRectangle(rc);
if (unicodeMode) {
wchar_t tbuf[MAX_US_LEN];
int tlen = UCS2FromUTF8(s, len, tbuf, sizeof(tbuf)/sizeof(wchar_t));
tbuf[tlen] = L'\0';
- ::ExtTextOutW(hdc, rc.left, ybase, ETO_OPAQUE, &rcw, tbuf, tlen, NULL);
+ ::ExtTextOutW(reinterpret_cast<HDC>(hdc), rc.left, ybase, ETO_OPAQUE, &rcw, tbuf, tlen, NULL);
} else {
- ::ExtTextOut(hdc, rc.left, ybase, ETO_OPAQUE, &rcw, s, len, NULL);
+ ::ExtTextOut(reinterpret_cast<HDC>(hdc), rc.left, ybase, ETO_OPAQUE, &rcw, s, len, NULL);
}
}
-void Surface::DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, Colour fore, Colour back) {
+void Surface::DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len,
+ ColourAllocated fore, ColourAllocated back) {
SetFont(font_);
- ::SetTextColor(hdc, fore.AsLong());
- ::SetBkColor(hdc, back.AsLong());
+ ::SetTextColor(reinterpret_cast<HDC>(hdc), fore.AsLong());
+ ::SetBkColor(reinterpret_cast<HDC>(hdc), back.AsLong());
RECT rcw = RectFromPRectangle(rc);
if (unicodeMode) {
wchar_t tbuf[MAX_US_LEN];
int tlen = UCS2FromUTF8(s, len, tbuf, sizeof(tbuf)/sizeof(wchar_t));
tbuf[tlen] = L'\0';
- ::ExtTextOutW(hdc, rc.left, ybase, ETO_OPAQUE | ETO_CLIPPED, &rcw, tbuf, tlen, NULL);
+ ::ExtTextOutW(reinterpret_cast<HDC>(hdc), rc.left, ybase, ETO_OPAQUE | ETO_CLIPPED, &rcw, tbuf, tlen, NULL);
} else {
- ::ExtTextOut(hdc, rc.left, ybase, ETO_OPAQUE | ETO_CLIPPED, &rcw, s, len, NULL);
+ ::ExtTextOut(reinterpret_cast<HDC>(hdc), rc.left, ybase, ETO_OPAQUE | ETO_CLIPPED, &rcw, s, len, NULL);
}
}
@@ -475,9 +457,9 @@ int Surface::WidthText(Font &font_, const char *s, int len) {
wchar_t tbuf[MAX_US_LEN];
int tlen = UCS2FromUTF8(s, len, tbuf, sizeof(tbuf)/sizeof(wchar_t));
tbuf[tlen] = L'\0';
- ::GetTextExtentPoint32W(hdc, tbuf, tlen, &sz);
+ ::GetTextExtentPoint32W(reinterpret_cast<HDC>(hdc), tbuf, tlen, &sz);
} else {
- ::GetTextExtentPoint32(hdc, s, len, &sz);
+ ::GetTextExtentPoint32(reinterpret_cast<HDC>(hdc), s, len, &sz);
}
return sz.cx;
}
@@ -492,12 +474,12 @@ void Surface::MeasureWidths(Font &font_, const char *s, int len, int *positions)
tbuf[tlen] = L'\0';
int poses[MAX_US_LEN];
fit = tlen;
- if (!::GetTextExtentExPointW(hdc, tbuf, tlen, 30000, &fit, poses, &sz)) {
+ if (!::GetTextExtentExPointW(reinterpret_cast<HDC>(hdc), tbuf, tlen, 30000, &fit, poses, &sz)) {
// Likely to have failed because on Windows 9x where function not available
// So measure the character widths by measuring each initial substring
// Turns a linear operation into a qudratic but seems fast enough on test files
for (int widthSS=0; widthSS < tlen; widthSS++) {
- ::GetTextExtentPoint32W(hdc, tbuf, widthSS+1, &sz);
+ ::GetTextExtentPoint32W(reinterpret_cast<HDC>(hdc), tbuf, widthSS+1, &sz);
poses[widthSS] = sz.cx;
}
}
@@ -520,7 +502,7 @@ void Surface::MeasureWidths(Font &font_, const char *s, int len, int *positions)
}
positions[i] = sz.cx;
} else {
- if (!::GetTextExtentExPoint(hdc, s, len, 30000, &fit, positions, &sz)) {
+ if (!::GetTextExtentExPoint(reinterpret_cast<HDC>(hdc), s, len, 30000, &fit, positions, &sz)) {
// Eeek - a NULL DC or other foolishness could cause this.
// The least we can do is set the positions to zero!
memset(positions, 0, len * sizeof(*positions));
@@ -536,67 +518,70 @@ void Surface::MeasureWidths(Font &font_, const char *s, int len, int *positions)
int Surface::WidthChar(Font &font_, char ch) {
SetFont(font_);
SIZE sz;
- ::GetTextExtentPoint32(hdc, &ch, 1, &sz);
+ ::GetTextExtentPoint32(reinterpret_cast<HDC>(hdc), &ch, 1, &sz);
return sz.cx;
}
int Surface::Ascent(Font &font_) {
SetFont(font_);
TEXTMETRIC tm;
- ::GetTextMetrics(hdc, &tm);
+ ::GetTextMetrics(reinterpret_cast<HDC>(hdc), &tm);
return tm.tmAscent;
}
int Surface::Descent(Font &font_) {
SetFont(font_);
TEXTMETRIC tm;
- ::GetTextMetrics(hdc, &tm);
+ ::GetTextMetrics(reinterpret_cast<HDC>(hdc), &tm);
return tm.tmDescent;
}
int Surface::InternalLeading(Font &font_) {
SetFont(font_);
TEXTMETRIC tm;
- ::GetTextMetrics(hdc, &tm);
+ ::GetTextMetrics(reinterpret_cast<HDC>(hdc), &tm);
return tm.tmInternalLeading;
}
int Surface::ExternalLeading(Font &font_) {
SetFont(font_);
TEXTMETRIC tm;
- ::GetTextMetrics(hdc, &tm);
+ ::GetTextMetrics(reinterpret_cast<HDC>(hdc), &tm);
return tm.tmExternalLeading;
}
int Surface::Height(Font &font_) {
SetFont(font_);
TEXTMETRIC tm;
- ::GetTextMetrics(hdc, &tm);
+ ::GetTextMetrics(reinterpret_cast<HDC>(hdc), &tm);
return tm.tmHeight;
}
int Surface::AverageCharWidth(Font &font_) {
SetFont(font_);
TEXTMETRIC tm;
- ::GetTextMetrics(hdc, &tm);
+ ::GetTextMetrics(reinterpret_cast<HDC>(hdc), &tm);
return tm.tmAveCharWidth;
}
int Surface::SetPalette(Palette *pal, bool inBackGround) {
if (paletteOld) {
- ::SelectPalette(hdc,paletteOld,TRUE);
+ ::SelectPalette(reinterpret_cast<HDC>(hdc),
+ reinterpret_cast<HPALETTE>(paletteOld),TRUE);
}
paletteOld = 0;
int changes = 0;
if (pal->allowRealization) {
- paletteOld = ::SelectPalette(hdc, pal->hpal, inBackGround);
- changes = ::RealizePalette(hdc);
+ paletteOld = ::SelectPalette(
+ reinterpret_cast<HDC>(hdc),
+ reinterpret_cast<HPALETTE>(pal->hpal), inBackGround);
+ changes = ::RealizePalette(reinterpret_cast<HDC>(hdc));
}
return changes;
}
void Surface::SetClip(PRectangle rc) {
- ::IntersectClipRect(hdc, rc.left, rc.top, rc.right, rc.bottom);
+ ::IntersectClipRect(reinterpret_cast<HDC>(hdc), rc.left, rc.top, rc.right, rc.bottom);
}
void Surface::FlushCachedState() {
@@ -610,7 +595,7 @@ Window::~Window() {
void Window::Destroy() {
if (id)
- ::DestroyWindow(id);
+ ::DestroyWindow(reinterpret_cast<HWND>(id));
id = 0;
}
@@ -620,12 +605,13 @@ bool Window::HasFocus() {
PRectangle Window::GetPosition() {
RECT rc;
- ::GetWindowRect(id, &rc);
+ ::GetWindowRect(reinterpret_cast<HWND>(id), &rc);
return PRectangle(rc.left, rc.top, rc.right, rc.bottom);
}
void Window::SetPosition(PRectangle rc) {
- ::SetWindowPos(id, 0, rc.left, rc.top, rc.Width(), rc.Height(), 0);
+ ::SetWindowPos(reinterpret_cast<HWND>(id),
+ 0, rc.left, rc.top, rc.Width(), rc.Height(), 0);
}
void Window::SetPositionRelative(PRectangle rc, Window) {
@@ -634,28 +620,32 @@ void Window::SetPositionRelative(PRectangle rc, Window) {
PRectangle Window::GetClientPosition() {
RECT rc;
- ::GetClientRect(id, &rc);
+ ::GetClientRect(reinterpret_cast<HWND>(id), &rc);
return PRectangle(rc.left, rc.top, rc.right, rc.bottom);
}
void Window::Show(bool show) {
if (show)
- ::ShowWindow(id, SW_SHOWNORMAL);
+ ::ShowWindow(reinterpret_cast<HWND>(id), SW_SHOWNORMAL);
else
- ::ShowWindow(id, SW_HIDE);
+ ::ShowWindow(reinterpret_cast<HWND>(id), SW_HIDE);
}
void Window::InvalidateAll() {
- ::InvalidateRect(id, NULL, FALSE);
+ ::InvalidateRect(reinterpret_cast<HWND>(id), NULL, FALSE);
}
void Window::InvalidateRectangle(PRectangle rc) {
RECT rcw = RectFromPRectangle(rc);
- ::InvalidateRect(id, &rcw, FALSE);
+ ::InvalidateRect(reinterpret_cast<HWND>(id), &rcw, FALSE);
+}
+
+static LRESULT Window_SendMessage(Window *w, UINT msg, WPARAM wParam=0, LPARAM lParam=0) {
+ return ::SendMessage(reinterpret_cast<HWND>(w->GetID()), msg, wParam, lParam);
}
void Window::SetFont(Font &font) {
- SendMessage(WM_SETFONT,
+ Window_SendMessage(this, WM_SETFONT,
reinterpret_cast<WPARAM>(font.GetID()), 0);
}
@@ -695,23 +685,7 @@ void Window::SetCursor(Cursor curs) {
}
void Window::SetTitle(const char *s) {
- ::SetWindowText(id, s);
-}
-
-LRESULT Window::SendMessage(UINT msg, WPARAM wParam, LPARAM lParam) {
- if (id)
- return ::SendMessage(id, msg, wParam, lParam);
- else
- return 0;
-}
-
-int Window::GetDlgCtrlID() {
- return ::GetDlgCtrlID(id);
-}
-
-HINSTANCE Window::GetInstance() {
- return reinterpret_cast<HINSTANCE>(
- ::GetWindowLong(id,GWL_HINSTANCE));
+ ::SetWindowText(reinterpret_cast<HWND>(id), s);
}
ListBox::ListBox() : desiredVisibleRows(5), maxItemCharacters(0), aveCharWidth(8) {
@@ -721,11 +695,15 @@ ListBox::~ListBox() {
}
void ListBox::Create(Window &parent, int ctrlID) {
+ HINSTANCE hinstanceParent = reinterpret_cast<HINSTANCE>(
+ ::GetWindowLong(reinterpret_cast<HWND>(parent.GetID()),GWL_HINSTANCE));
id = ::CreateWindowEx(
WS_EX_WINDOWEDGE, "listbox", "",
WS_CHILD | WS_THICKFRAME | WS_VSCROLL | LBS_NOTIFY,
- 100,100, 150,80, parent.GetID(), reinterpret_cast<HMENU>(ctrlID),
- parent.GetInstance(), 0);
+ 100,100, 150,80, reinterpret_cast<HWND>(parent.GetID()),
+ reinterpret_cast<HMENU>(ctrlID),
+ hinstanceParent,
+ 0);
}
void ListBox::SetFont(Font &font) {
@@ -742,7 +720,7 @@ void ListBox::SetVisibleRows(int rows) {
PRectangle ListBox::GetDesiredRect() {
PRectangle rcDesired = GetPosition();
- int itemHeight = SendMessage(LB_GETITEMHEIGHT, 0);
+ int itemHeight = Window_SendMessage(this, LB_GETITEMHEIGHT, 0);
int rows = Length();
if ((rows == 0) || (rows > desiredVisibleRows))
rows = desiredVisibleRows;
@@ -758,40 +736,40 @@ PRectangle ListBox::GetDesiredRect() {
}
void ListBox::Clear() {
- SendMessage(LB_RESETCONTENT);
+ Window_SendMessage(this, LB_RESETCONTENT);
maxItemCharacters = 0;
}
void ListBox::Append(char *s) {
- SendMessage(LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(s));
+ Window_SendMessage(this, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(s));
size_t len = strlen(s);
if (maxItemCharacters < len)
maxItemCharacters = len;
}
int ListBox::Length() {
- return SendMessage(LB_GETCOUNT);
+ return Window_SendMessage(this, LB_GETCOUNT);
}
void ListBox::Select(int n) {
- SendMessage(LB_SETCURSEL, n);
+ Window_SendMessage(this, LB_SETCURSEL, n);
}
int ListBox::GetSelection() {
- return SendMessage(LB_GETCURSEL);
+ return Window_SendMessage(this, LB_GETCURSEL);
}
int ListBox::Find(const char *prefix) {
- return SendMessage(LB_FINDSTRING, static_cast<WPARAM>(-1),
- reinterpret_cast<LPARAM>(prefix));
+ return Window_SendMessage(this, LB_FINDSTRING, static_cast<WPARAM>(-1),
+ reinterpret_cast<LPARAM>(prefix));
}
void ListBox::GetValue(int n, char *value, int len) {
- int lenText = SendMessage(LB_GETTEXTLEN, n);
+ int lenText = Window_SendMessage(this, LB_GETTEXTLEN, n);
if ((len > 0) && (lenText > 0)){
char *text = new char[len+1];
if (text) {
- SendMessage(LB_GETTEXT, n, reinterpret_cast<LPARAM>(text));
+ Window_SendMessage(this, LB_GETTEXT, n, reinterpret_cast<LPARAM>(text));
strncpy(value, text, len);
value[len-1] = '\0';
delete []text;
@@ -817,20 +795,22 @@ void Menu::CreatePopUp() {
void Menu::Destroy() {
if (id)
- ::DestroyMenu(id);
+ ::DestroyMenu(reinterpret_cast<HMENU>(id));
id = 0;
}
void Menu::Show(Point pt, Window &w) {
- ::TrackPopupMenu(id, 0, pt.x - 4, pt.y, 0, w.GetID(), NULL);
+ ::TrackPopupMenu(reinterpret_cast<HMENU>(id),
+ 0, pt.x - 4, pt.y, 0,
+ reinterpret_cast<HWND>(w.GetID()), NULL);
Destroy();
}
-Colour Platform::Chrome() {
+ColourDesired Platform::Chrome() {
return ::GetSysColor(COLOR_3DFACE);
}
-Colour Platform::ChromeHighlight() {
+ColourDesired Platform::ChromeHighlight() {
return ::GetSysColor(COLOR_3DHIGHLIGHT);
}
@@ -855,7 +835,11 @@ bool Platform::IsKeyDown(int key) {
}
long Platform::SendScintilla(WindowID w, unsigned int msg, unsigned long wParam, long lParam) {
- return ::SendMessage(w, msg, wParam, lParam);
+ return ::SendMessage(reinterpret_cast<HWND>(w), msg, wParam, lParam);
+}
+
+bool Platform::IsDBCSLeadByte(int codePage, char ch) {
+ return ::IsDBCSLeadByteEx(codePage, ch);
}
// These are utility functions not really tied to a platform