aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2017-05-02 10:06:46 +1000
committerNeil <nyamatongwe@gmail.com>2017-05-02 10:06:46 +1000
commitffeb34c29ffd27e1a1a67cb26ceec8fc1253a410 (patch)
tree59d17870a0bea7b8a058100fdd98666227e7684e
parent782ada0bab34bb56c4023c070e6eb355ca32cdf2 (diff)
downloadscintilla-mirror-ffeb34c29ffd27e1a1a67cb26ceec8fc1253a410.tar.gz
Use unique_ptr for drawing surfaces and don't check for allocation failure
as that throws an exception. Also use unique_ptr for tab stop positions.
-rw-r--r--src/CallTip.cxx8
-rw-r--r--src/EditView.cxx34
-rw-r--r--src/EditView.h8
-rw-r--r--src/Editor.cxx2
-rw-r--r--src/Editor.h31
-rw-r--r--src/MarginView.cxx18
-rw-r--r--src/MarginView.h6
-rw-r--r--win32/PlatWin.cxx80
-rw-r--r--win32/ScintillaWin.cxx82
9 files changed, 117 insertions, 152 deletions
diff --git a/src/CallTip.cxx b/src/CallTip.cxx
index c3d1ca767..de2b37c63 100644
--- a/src/CallTip.cxx
+++ b/src/CallTip.cxx
@@ -12,6 +12,7 @@
#include <stdexcept>
#include <string>
#include <algorithm>
+#include <memory>
#include "Platform.h"
@@ -258,9 +259,7 @@ PRectangle CallTip::CallTipStart(Sci::Position pos, Point pt, int textHeight, co
clickPlace = 0;
val = defn;
codePage = codePage_;
- Surface *surfaceMeasure = Surface::Allocate(technology);
- if (!surfaceMeasure)
- return PRectangle();
+ std::unique_ptr<Surface> surfaceMeasure(Surface::Allocate(technology));
surfaceMeasure->Init(wParent.GetID());
surfaceMeasure->SetUnicodeMode(SC_CP_UTF8 == codePage);
surfaceMeasure->SetDBCSMode(codePage);
@@ -279,7 +278,7 @@ PRectangle CallTip::CallTipStart(Sci::Position pos, Point pt, int textHeight, co
rectUp = PRectangle(0,0,0,0);
rectDown = PRectangle(0,0,0,0);
offsetMain = insetX; // changed to right edge of any arrows
- int width = PaintContents(surfaceMeasure, false) + insetX;
+ const int width = PaintContents(surfaceMeasure.get(), false) + insetX;
while ((newline = strchr(look, '\n')) != NULL) {
look = newline + 1;
numLines++;
@@ -290,7 +289,6 @@ PRectangle CallTip::CallTipStart(Sci::Position pos, Point pt, int textHeight, co
// rectangle is aligned to the right edge of the last arrow encountered in
// the tip text, else to the tip text left edge.
int height = lineHeight * numLines - static_cast<int>(surfaceMeasure->InternalLeading(font)) + borderHeight * 2;
- delete surfaceMeasure;
if (above) {
return PRectangle(pt.x - offsetMain, pt.y - verticalOffset - height, pt.x + width - offsetMain, pt.y - verticalOffset);
} else {
diff --git a/src/EditView.cxx b/src/EditView.cxx
index 50555b0a1..d1ebc345a 100644
--- a/src/EditView.cxx
+++ b/src/EditView.cxx
@@ -175,7 +175,6 @@ void DrawStyledText(Surface *surface, const ViewStyle &vs, int styleOffset, PRec
const XYPOSITION epsilon = 0.0001f; // A small nudge to avoid floating point precision issues
EditView::EditView() {
- ldTabstops = NULL;
tabWidthMinimumPixels = 2; // needed for calculating tab stops for fractional proportional fonts
hideSelection = false;
drawOverstrikeCaret = true;
@@ -185,9 +184,6 @@ EditView::EditView() {
additionalCaretsBlink = true;
additionalCaretsVisible = true;
imeCaretBlockOverride = false;
- pixmapLine = 0;
- pixmapIndentGuide = 0;
- pixmapIndentGuideHighlight = 0;
llc.SetLevel(LineLayoutCache::llcCaret);
posCache.SetSize(0x400);
tabArrowHeight = 4;
@@ -196,8 +192,6 @@ EditView::EditView() {
}
EditView::~EditView() {
- delete ldTabstops;
- ldTabstops = NULL;
}
bool EditView::SetTwoPhaseDraw(bool twoPhaseDraw) {
@@ -219,8 +213,7 @@ bool EditView::LinesOverlap() const {
}
void EditView::ClearAllTabstops() {
- delete ldTabstops;
- ldTabstops = 0;
+ ldTabstops.reset();
}
XYPOSITION EditView::NextTabstopPos(Sci::Line line, XYPOSITION x, XYPOSITION tabWidth) const {
@@ -231,20 +224,20 @@ XYPOSITION EditView::NextTabstopPos(Sci::Line line, XYPOSITION x, XYPOSITION tab
}
bool EditView::ClearTabstops(Sci::Line line) {
- LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops);
+ LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops.get());
return lt && lt->ClearTabstops(line);
}
bool EditView::AddTabstop(Sci::Line line, int x) {
if (!ldTabstops) {
- ldTabstops = new LineTabstops();
+ ldTabstops.reset(new LineTabstops());
}
- LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops);
+ LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops.get());
return lt && lt->AddTabstop(line, x);
}
int EditView::GetNextTabstop(Sci::Line line, int x) const {
- const LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops);
+ const LineTabstops *lt = static_cast<LineTabstops *>(ldTabstops.get());
if (lt) {
return lt->GetNextTabstop(line, x);
} else {
@@ -268,12 +261,9 @@ void EditView::LinesAddedOrRemoved(Sci::Line lineOfPos, Sci::Line linesAdded) {
void EditView::DropGraphics(bool freeObjects) {
if (freeObjects) {
- delete pixmapLine;
- pixmapLine = 0;
- delete pixmapIndentGuide;
- pixmapIndentGuide = 0;
- delete pixmapIndentGuideHighlight;
- pixmapIndentGuideHighlight = 0;
+ pixmapLine.reset();
+ pixmapIndentGuide.reset();
+ pixmapIndentGuideHighlight.reset();
} else {
if (pixmapLine)
pixmapLine->Release();
@@ -286,11 +276,11 @@ void EditView::DropGraphics(bool freeObjects) {
void EditView::AllocateGraphics(const ViewStyle &vsDraw) {
if (!pixmapLine)
- pixmapLine = Surface::Allocate(vsDraw.technology);
+ pixmapLine.reset(Surface::Allocate(vsDraw.technology));
if (!pixmapIndentGuide)
- pixmapIndentGuide = Surface::Allocate(vsDraw.technology);
+ pixmapIndentGuide.reset(Surface::Allocate(vsDraw.technology));
if (!pixmapIndentGuideHighlight)
- pixmapIndentGuideHighlight = Surface::Allocate(vsDraw.technology);
+ pixmapIndentGuideHighlight.reset(Surface::Allocate(vsDraw.technology));
}
static const char *ControlCharacterString(unsigned char ch) {
@@ -1984,7 +1974,7 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan
Surface *surface = surfaceWindow;
if (bufferedDraw) {
- surface = pixmapLine;
+ surface = pixmapLine.get();
PLATFORM_ASSERT(pixmapLine->Initialised());
}
surface->SetUnicodeMode(SC_CP_UTF8 == model.pdoc->dbcsCodePage);
diff --git a/src/EditView.h b/src/EditView.h
index 7a3926aa2..a842ac63a 100644
--- a/src/EditView.h
+++ b/src/EditView.h
@@ -50,7 +50,7 @@ typedef void (*DrawTabArrowFn)(Surface *surface, PRectangle rcTab, int ymid);
class EditView {
public:
PrintParameters printParameters;
- PerLine *ldTabstops;
+ std::unique_ptr<PerLine> ldTabstops;
int tabWidthMinimumPixels;
bool hideSelection;
@@ -74,9 +74,9 @@ public:
bool imeCaretBlockOverride;
- Surface *pixmapLine;
- Surface *pixmapIndentGuide;
- Surface *pixmapIndentGuideHighlight;
+ std::unique_ptr<Surface> pixmapLine;
+ std::unique_ptr<Surface> pixmapIndentGuide;
+ std::unique_ptr<Surface> pixmapIndentGuideHighlight;
LineLayoutCache llc;
PositionCache posCache;
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 5330ea45b..9344b7d94 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -1653,7 +1653,7 @@ void Editor::PaintSelMargin(Surface *surfaceWindow, PRectangle &rc) {
Surface *surface;
if (view.bufferedDraw) {
- surface = marginView.pixmapSelMargin;
+ surface = marginView.pixmapSelMargin.get();
} else {
surface = surfaceWindow;
}
diff --git a/src/Editor.h b/src/Editor.h
index 9ddb753e6..69c816270 100644
--- a/src/Editor.h
+++ b/src/Editor.h
@@ -602,39 +602,34 @@ public:
*/
class AutoSurface {
private:
- Surface *surf;
+ std::unique_ptr<Surface> surf;
public:
- AutoSurface(Editor *ed, int technology = -1) : surf(0) {
+ AutoSurface(Editor *ed, int technology = -1) {
if (ed->wMain.GetID()) {
- surf = Surface::Allocate(technology != -1 ? technology : ed->technology);
- if (surf) {
- surf->Init(ed->wMain.GetID());
- surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage());
- surf->SetDBCSMode(ed->CodePage());
- }
+ surf.reset(Surface::Allocate(technology != -1 ? technology : ed->technology));
+ surf->Init(ed->wMain.GetID());
+ surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage());
+ surf->SetDBCSMode(ed->CodePage());
}
}
- AutoSurface(SurfaceID sid, Editor *ed, int technology = -1) : surf(0) {
+ AutoSurface(SurfaceID sid, Editor *ed, int technology = -1) {
if (ed->wMain.GetID()) {
- surf = Surface::Allocate(technology != -1 ? technology : ed->technology);
- if (surf) {
- surf->Init(sid, ed->wMain.GetID());
- surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage());
- surf->SetDBCSMode(ed->CodePage());
- }
+ surf.reset(Surface::Allocate(technology != -1 ? technology : ed->technology));
+ surf->Init(sid, ed->wMain.GetID());
+ surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage());
+ surf->SetDBCSMode(ed->CodePage());
}
}
// Deleted so AutoSurface objects can not be copied.
AutoSurface(const AutoSurface &) = delete;
void operator=(const AutoSurface &) = delete;
~AutoSurface() {
- delete surf;
}
Surface *operator->() const {
- return surf;
+ return surf.get();
}
operator Surface *() const {
- return surf;
+ return surf.get();
}
};
diff --git a/src/MarginView.cxx b/src/MarginView.cxx
index 27bf1e10d..e371a4891 100644
--- a/src/MarginView.cxx
+++ b/src/MarginView.cxx
@@ -102,21 +102,15 @@ void DrawWrapMarker(Surface *surface, PRectangle rcPlace,
}
MarginView::MarginView() {
- pixmapSelMargin = 0;
- pixmapSelPattern = 0;
- pixmapSelPatternOffset1 = 0;
wrapMarkerPaddingRight = 3;
customDrawWrapMarker = NULL;
}
void MarginView::DropGraphics(bool freeObjects) {
if (freeObjects) {
- delete pixmapSelMargin;
- pixmapSelMargin = 0;
- delete pixmapSelPattern;
- pixmapSelPattern = 0;
- delete pixmapSelPatternOffset1;
- pixmapSelPatternOffset1 = 0;
+ pixmapSelMargin.reset();
+ pixmapSelPattern.reset();
+ pixmapSelPatternOffset1.reset();
} else {
if (pixmapSelMargin)
pixmapSelMargin->Release();
@@ -129,11 +123,11 @@ void MarginView::DropGraphics(bool freeObjects) {
void MarginView::AllocateGraphics(const ViewStyle &vsDraw) {
if (!pixmapSelMargin)
- pixmapSelMargin = Surface::Allocate(vsDraw.technology);
+ pixmapSelMargin.reset(Surface::Allocate(vsDraw.technology));
if (!pixmapSelPattern)
- pixmapSelPattern = Surface::Allocate(vsDraw.technology);
+ pixmapSelPattern.reset(Surface::Allocate(vsDraw.technology));
if (!pixmapSelPatternOffset1)
- pixmapSelPatternOffset1 = Surface::Allocate(vsDraw.technology);
+ pixmapSelPatternOffset1.reset(Surface::Allocate(vsDraw.technology));
}
void MarginView::RefreshPixMaps(Surface *surfaceWindow, WindowID wid, const ViewStyle &vsDraw) {
diff --git a/src/MarginView.h b/src/MarginView.h
index eb136d71e..695126ad9 100644
--- a/src/MarginView.h
+++ b/src/MarginView.h
@@ -21,9 +21,9 @@ typedef void (*DrawWrapMarkerFn)(Surface *surface, PRectangle rcPlace, bool isEn
*/
class MarginView {
public:
- Surface *pixmapSelMargin;
- Surface *pixmapSelPattern;
- Surface *pixmapSelPatternOffset1;
+ std::unique_ptr<Surface> pixmapSelMargin;
+ std::unique_ptr<Surface> pixmapSelPattern;
+ std::unique_ptr<Surface> pixmapSelPatternOffset1;
// Highlight current folding block
HighlightDelimiter highlightDelimiter;
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index 31e71988a..ee1d2d71c 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -2309,54 +2309,46 @@ void ListBoxX::Draw(DRAWITEMSTRUCT *pDrawItem) {
// Draw the image, if any
const RGBAImage *pimage = images.Get(pixId);
if (pimage) {
- Surface *surfaceItem = Surface::Allocate(technology);
- if (surfaceItem) {
- if (technology == SCWIN_TECH_GDI) {
- surfaceItem->Init(pDrawItem->hDC, pDrawItem->hwndItem);
- const long left = pDrawItem->rcItem.left + static_cast<int>(ItemInset.x + ImageInset.x);
- PRectangle rcImage = PRectangle::FromInts(left, pDrawItem->rcItem.top,
- left + images.GetWidth(), pDrawItem->rcItem.bottom);
- surfaceItem->DrawRGBAImage(rcImage,
- pimage->GetWidth(), pimage->GetHeight(), pimage->Pixels());
- delete surfaceItem;
- ::SetTextAlign(pDrawItem->hDC, TA_TOP);
- } else {
+ std::unique_ptr<Surface> surfaceItem(Surface::Allocate(technology));
+ if (technology == SCWIN_TECH_GDI) {
+ surfaceItem->Init(pDrawItem->hDC, pDrawItem->hwndItem);
+ const long left = pDrawItem->rcItem.left + static_cast<int>(ItemInset.x + ImageInset.x);
+ PRectangle rcImage = PRectangle::FromInts(left, pDrawItem->rcItem.top,
+ left + images.GetWidth(), pDrawItem->rcItem.bottom);
+ surfaceItem->DrawRGBAImage(rcImage,
+ pimage->GetWidth(), pimage->GetHeight(), pimage->Pixels());
+ ::SetTextAlign(pDrawItem->hDC, TA_TOP);
+ } else {
#if defined(USE_D2D)
- D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
- D2D1_RENDER_TARGET_TYPE_DEFAULT,
- D2D1::PixelFormat(
- DXGI_FORMAT_B8G8R8A8_UNORM,
- D2D1_ALPHA_MODE_IGNORE),
- 0,
- 0,
- D2D1_RENDER_TARGET_USAGE_NONE,
- D2D1_FEATURE_LEVEL_DEFAULT
- );
- ID2D1DCRenderTarget *pDCRT = 0;
- HRESULT hr = pD2DFactory->CreateDCRenderTarget(&props, &pDCRT);
+ D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
+ D2D1_RENDER_TARGET_TYPE_DEFAULT,
+ D2D1::PixelFormat(
+ DXGI_FORMAT_B8G8R8A8_UNORM,
+ D2D1_ALPHA_MODE_IGNORE),
+ 0,
+ 0,
+ D2D1_RENDER_TARGET_USAGE_NONE,
+ D2D1_FEATURE_LEVEL_DEFAULT
+ );
+ ID2D1DCRenderTarget *pDCRT = 0;
+ HRESULT hr = pD2DFactory->CreateDCRenderTarget(&props, &pDCRT);
+ if (SUCCEEDED(hr)) {
+ RECT rcWindow;
+ GetClientRect(pDrawItem->hwndItem, &rcWindow);
+ hr = pDCRT->BindDC(pDrawItem->hDC, &rcWindow);
if (SUCCEEDED(hr)) {
- RECT rcWindow;
- GetClientRect(pDrawItem->hwndItem, &rcWindow);
- hr = pDCRT->BindDC(pDrawItem->hDC, &rcWindow);
- if (SUCCEEDED(hr)) {
- surfaceItem->Init(pDCRT, pDrawItem->hwndItem);
- pDCRT->BeginDraw();
- const long left = pDrawItem->rcItem.left + static_cast<long>(ItemInset.x + ImageInset.x);
- PRectangle rcImage = PRectangle::FromInts(left, pDrawItem->rcItem.top,
- left + images.GetWidth(), pDrawItem->rcItem.bottom);
- surfaceItem->DrawRGBAImage(rcImage,
- pimage->GetWidth(), pimage->GetHeight(), pimage->Pixels());
- delete surfaceItem;
- pDCRT->EndDraw();
- pDCRT->Release();
- } else {
- delete surfaceItem;
- }
- } else {
- delete surfaceItem;
+ surfaceItem->Init(pDCRT, pDrawItem->hwndItem);
+ pDCRT->BeginDraw();
+ const long left = pDrawItem->rcItem.left + static_cast<long>(ItemInset.x + ImageInset.x);
+ PRectangle rcImage = PRectangle::FromInts(left, pDrawItem->rcItem.top,
+ left + images.GetWidth(), pDrawItem->rcItem.bottom);
+ surfaceItem->DrawRGBAImage(rcImage,
+ pimage->GetWidth(), pimage->GetHeight(), pimage->Pixels());
+ pDCRT->EndDraw();
+ pDCRT->Release();
}
-#endif
}
+#endif
}
}
}
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx
index 155ebdb72..cb762e54a 100644
--- a/win32/ScintillaWin.cxx
+++ b/win32/ScintillaWin.cxx
@@ -3289,57 +3289,53 @@ LRESULT PASCAL ScintillaWin::CTWndProc(
} else if (iMessage == WM_PAINT) {
PAINTSTRUCT ps;
::BeginPaint(hWnd, &ps);
- Surface *surfaceWindow = Surface::Allocate(sciThis->technology);
- if (surfaceWindow) {
+ std::unique_ptr<Surface> surfaceWindow(Surface::Allocate(sciThis->technology));
#if defined(USE_D2D)
- ID2D1HwndRenderTarget *pCTRenderTarget = 0;
+ ID2D1HwndRenderTarget *pCTRenderTarget = 0;
#endif
- RECT rc;
- GetClientRect(hWnd, &rc);
- // Create a Direct2D render target.
- if (sciThis->technology == SC_TECHNOLOGY_DEFAULT) {
- surfaceWindow->Init(ps.hdc, hWnd);
- } else {
+ RECT rc;
+ GetClientRect(hWnd, &rc);
+ // Create a Direct2D render target.
+ if (sciThis->technology == SC_TECHNOLOGY_DEFAULT) {
+ surfaceWindow->Init(ps.hdc, hWnd);
+ } else {
#if defined(USE_D2D)
- D2D1_HWND_RENDER_TARGET_PROPERTIES dhrtp;
- dhrtp.hwnd = hWnd;
- dhrtp.pixelSize = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);
- dhrtp.presentOptions = (sciThis->technology == SC_TECHNOLOGY_DIRECTWRITERETAIN) ?
- D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS : D2D1_PRESENT_OPTIONS_NONE;
-
- D2D1_RENDER_TARGET_PROPERTIES drtp;
- drtp.type = D2D1_RENDER_TARGET_TYPE_DEFAULT;
- drtp.pixelFormat.format = DXGI_FORMAT_UNKNOWN;
- drtp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_UNKNOWN;
- drtp.dpiX = 96.0;
- drtp.dpiY = 96.0;
- drtp.usage = D2D1_RENDER_TARGET_USAGE_NONE;
- drtp.minLevel = D2D1_FEATURE_LEVEL_DEFAULT;
-
- if (!SUCCEEDED(pD2DFactory->CreateHwndRenderTarget(drtp, dhrtp, &pCTRenderTarget))) {
- surfaceWindow->Release();
- delete surfaceWindow;
- ::EndPaint(hWnd, &ps);
- return 0;
- }
- surfaceWindow->Init(pCTRenderTarget, hWnd);
- pCTRenderTarget->BeginDraw();
-#endif
+ D2D1_HWND_RENDER_TARGET_PROPERTIES dhrtp;
+ dhrtp.hwnd = hWnd;
+ dhrtp.pixelSize = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);
+ dhrtp.presentOptions = (sciThis->technology == SC_TECHNOLOGY_DIRECTWRITERETAIN) ?
+ D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS : D2D1_PRESENT_OPTIONS_NONE;
+
+ D2D1_RENDER_TARGET_PROPERTIES drtp;
+ drtp.type = D2D1_RENDER_TARGET_TYPE_DEFAULT;
+ drtp.pixelFormat.format = DXGI_FORMAT_UNKNOWN;
+ drtp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_UNKNOWN;
+ drtp.dpiX = 96.0;
+ drtp.dpiY = 96.0;
+ drtp.usage = D2D1_RENDER_TARGET_USAGE_NONE;
+ drtp.minLevel = D2D1_FEATURE_LEVEL_DEFAULT;
+
+ if (!SUCCEEDED(pD2DFactory->CreateHwndRenderTarget(drtp, dhrtp, &pCTRenderTarget))) {
+ surfaceWindow->Release();
+ ::EndPaint(hWnd, &ps);
+ return 0;
}
- surfaceWindow->SetUnicodeMode(SC_CP_UTF8 == sciThis->ct.codePage);
- surfaceWindow->SetDBCSMode(sciThis->ct.codePage);
- sciThis->ct.PaintCT(surfaceWindow);
+ surfaceWindow->Init(pCTRenderTarget, hWnd);
+ pCTRenderTarget->BeginDraw();
+#endif
+ }
+ surfaceWindow->SetUnicodeMode(SC_CP_UTF8 == sciThis->ct.codePage);
+ surfaceWindow->SetDBCSMode(sciThis->ct.codePage);
+ sciThis->ct.PaintCT(surfaceWindow.get());
#if defined(USE_D2D)
- if (pCTRenderTarget)
- pCTRenderTarget->EndDraw();
+ if (pCTRenderTarget)
+ pCTRenderTarget->EndDraw();
#endif
- surfaceWindow->Release();
- delete surfaceWindow;
+ surfaceWindow->Release();
#if defined(USE_D2D)
- if (pCTRenderTarget)
- pCTRenderTarget->Release();
+ if (pCTRenderTarget)
+ pCTRenderTarget->Release();
#endif
- }
::EndPaint(hWnd, &ps);
return 0;
} else if ((iMessage == WM_NCLBUTTONDOWN) || (iMessage == WM_NCLBUTTONDBLCLK)) {