1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*M///////////////////////////////////////////////////////////////////////////////////////
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//  By downloading, copying, installing or using the software you agree to this license.
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//  If you do not agree to this license, do not download, install,
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//  copy or use the software.
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//                        Intel License Agreement
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//                For Open Source Computer Vision Library
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (C) 2000, Intel Corporation, all rights reserved.
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Third party copyrights are property of their respective owners.
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Redistribution and use in source and binary forms, with or without modification,
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// are permitted provided that the following conditions are met:
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   * Redistribution's of source code must retain the above copyright notice,
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     this list of conditions and the following disclaimer.
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   * Redistribution's in binary form must reproduce the above copyright notice,
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     this list of conditions and the following disclaimer in the documentation
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     and/or other materials provided with the distribution.
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//   * The name of Intel Corporation may not be used to endorse or promote products
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//     derived from this software without specific prior written permission.
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// This software is provided by the copyright holders and contributors "as is" and
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// any express or implied warranties, including, but not limited to, the implied
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// warranties of merchantability and fitness for a particular purpose are disclaimed.
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// In no event shall the Intel Corporation or contributors be liable for any direct,
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// indirect, incidental, special, exemplary, or consequential damages
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// (including, but not limited to, procurement of substitute goods or services;
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// loss of use, data, or profits; or business interruption) however caused
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// and on any theory of liability, whether in contract, strict liability,
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// or tort (including negligence or otherwise) arising in any way out of
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// the use of this software, even if advised of the possibility of such damage.
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//M*/
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "precomp.hpp"
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <windowsx.h> // required for GET_X_LPARAM() and GET_Y_LPARAM() macros
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined WIN32 || defined _WIN32
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef __GNUC__
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#  pragma GCC diagnostic ignored "-Wmissing-declarations"
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if (_WIN32_IE < 0x0500)
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#pragma message("WARNING: Win32 UI needs to be compiled with _WIN32_IE >= 0x0500 (_WIN32_IE_IE50)")
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define _WIN32_IE 0x0500
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <commctrl.h>
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <stdlib.h>
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <string.h>
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <stdio.h>
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <assert.h>
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <memory>
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <algorithm>
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <vector>
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <functional>
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/highgui.hpp"
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <GL\gl.h>
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic const char* trackbar_text =
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler"                                                                                             ";
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined _M_X64 || defined __x86_64
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvGetWindowLongPtr GetWindowLongPtr
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvSetWindowLongPtr( hwnd, id, ptr ) SetWindowLongPtr( hwnd, id, (LONG_PTR)(ptr) )
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvGetClassLongPtr  GetClassLongPtr
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_USERDATA GWLP_USERDATA
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_WNDPROC GWLP_WNDPROC
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_HCURSOR GCLP_HCURSOR
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_HBRBACKGROUND GCLP_HBRBACKGROUND
84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvGetWindowLongPtr GetWindowLong
88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvSetWindowLongPtr( hwnd, id, ptr ) SetWindowLong( hwnd, id, (size_t)ptr )
89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define icvGetClassLongPtr GetClassLong
90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_USERDATA GWL_USERDATA
92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_WNDPROC GWL_WNDPROC
93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_HCURSOR GCL_HCURSOR
94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define CV_HBRBACKGROUND GCL_HBRBACKGROUND
95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef WM_MOUSEHWHEEL
99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    #define WM_MOUSEHWHEEL 0x020E
100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin )
103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    memset( bmih, 0, sizeof(*bmih));
109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bmih->biSize = sizeof(BITMAPINFOHEADER);
110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bmih->biWidth = width;
111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bmih->biHeight = origin ? abs(height) : -abs(height);
112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bmih->biPlanes = 1;
113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bmih->biBitCount = (unsigned short)bpp;
114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bmih->biCompression = BI_RGB;
115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( bpp == 8 )
117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RGBQUAD* palette = bmi->bmiColors;
119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int i;
120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for( i = 0; i < 256; i++ )
121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            palette[i].rgbReserved = 0;
124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstruct CvWindow;
129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct CvTrackbar
131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int signature;
133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HWND hwnd;
134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    char* name;
135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvTrackbar* next;
136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* parent;
137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HWND buddy;
138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int* data;
139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int pos;
140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int maxval;
141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void (*notify)(int);
142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void (*notify2)(int, void*);
143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* userdata;
144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int id;
145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
146793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCvTrackbar;
147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct CvWindow
150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int signature;
152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HWND hwnd;
153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    char* name;
154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* prev;
155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* next;
156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HWND frame;
157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HDC dc;
159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HGDIOBJ image;
160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int last_key;
161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int flags;
162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int status;//0 normal, 1 fullscreen (YV)
163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvMouseCallback on_mouse;
165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* on_mouse_param;
166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    struct
168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        HWND toolbar;
170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int pos;
171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int rows;
172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        WNDPROC toolBarProc;
173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CvTrackbar* first;
174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    toolbar;
176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int width;
178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int height;
179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // OpenGL support
181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool useGl;
184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HGLRC hGLRC;
185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvOpenGlDrawCallback glDrawCallback;
187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* glDrawData;
188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
190793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCvWindow;
191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define HG_BUDDY_WIDTH  130
193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef TBIF_SIZE
195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    #define TBIF_SIZE  0x40
196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef TB_SETBUTTONINFO
199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    #define TB_SETBUTTONINFO (WM_USER + 66)
200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef TBM_GETTOOLTIPS
203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    #define TBM_GETTOOLTIPS  (WM_USER + 30)
204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK HighGUIProc(  HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK WindowProc(  HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK MainWindowProc(  HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvUpdateWindowPos( CvWindow* window );
210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvWindow* hg_windows = 0;
212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef int (CV_CDECL * CvWin32WindowCallback)(HWND, UINT, WPARAM, LPARAM, int*);
214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvWin32WindowCallback hg_on_preprocess = 0, hg_on_postprocess = 0;
215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic HINSTANCE hg_hinstance = 0;
216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic const char* highGUIclassName = "HighGUI class";
218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic const char* mainHighGUIclassName = "Main HighGUI class";
219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvCleanupHighgui()
221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cvDestroyAllWindows();
223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    UnregisterClass(highGUIclassName, hg_hinstance);
224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    UnregisterClass(mainHighGUIclassName, hg_hinstance);
225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
227793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int cvInitSystem( int, char** )
228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static int wasInitialized = 0;
230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // check initialization status
232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !wasInitialized )
233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Initialize the stogare
235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        hg_windows = 0;
236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Register the class
238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        WNDCLASS wndc;
239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.lpfnWndProc = WindowProc;
241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.cbClsExtra = 0;
242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.cbWndExtra = 0;
243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.hInstance = hg_hinstance;
244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.lpszClassName = highGUIclassName;
245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.lpszMenuName = highGUIclassName;
246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.hIcon = LoadIcon(0, IDI_APPLICATION);
247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.hCursor = (HCURSOR)LoadCursor(0, (LPSTR)(size_t)IDC_CROSS );
248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RegisterClass(&wndc);
251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.lpszClassName = mainHighGUIclassName;
253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.lpszMenuName = mainHighGUIclassName;
254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wndc.lpfnWndProc = MainWindowProc;
256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RegisterClass(&wndc);
258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        atexit( icvCleanupHighgui );
259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        wasInitialized = 1;
261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    setlocale(LC_NUMERIC,"C");
264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return 0;
266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
268793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int cvStartWindowThread(){
269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return 0;
270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvWindow* icvFindWindowByName( const char* name )
273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window = hg_windows;
275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for( ; window != 0 && strcmp( name, window->name) != 0; window = window->next )
277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ;
278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return window;
280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvWindow* icvWindowByHWND( HWND hwnd )
284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window = (CvWindow*)icvGetWindowLongPtr( hwnd, CV_USERDATA );
286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return window != 0 && hg_windows != 0 &&
287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           window->signature == CV_WINDOW_MAGIC_VAL ? window : 0;
288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvTrackbar* icvTrackbarByHWND( HWND hwnd )
292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvTrackbar* trackbar = (CvTrackbar*)icvGetWindowLongPtr( hwnd, CV_USERDATA );
294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return trackbar != 0 && trackbar->signature == CV_TRACKBAR_MAGIC_VAL &&
295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           trackbar->hwnd == hwnd ? trackbar : 0;
296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic const char* icvWindowPosRootKey = "Software\\OpenCV\\HighGUI\\Windows\\";
300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Window positions saving/loading added by Philip Gruebele.
302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//<a href="mailto:pgruebele@cox.net">pgruebele@cox.net</a>
303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Restores the window position from the registry saved position.
304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void
305793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslericvLoadWindowPos( const char* name, CvRect& rect )
306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HKEY hkey;
308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    char szKey[1024];
309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    strcpy( szKey, icvWindowPosRootKey );
310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    strcat( szKey, name );
311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rect.x = rect.y = CW_USEDEFAULT;
313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rect.width = rect.height = 320;
314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( RegOpenKeyEx(HKEY_CURRENT_USER,szKey,0,KEY_QUERY_VALUE,&hkey) == ERROR_SUCCESS )
316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Yes we are installed.
318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        DWORD dwType = 0;
319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        DWORD dwSize = sizeof(int);
320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RegQueryValueEx(hkey, "Left", NULL, &dwType, (BYTE*)&rect.x, &dwSize);
322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RegQueryValueEx(hkey, "Top", NULL, &dwType, (BYTE*)&rect.y, &dwSize);
323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RegQueryValueEx(hkey, "Width", NULL, &dwType, (BYTE*)&rect.width, &dwSize);
324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RegQueryValueEx(hkey, "Height", NULL, &dwType, (BYTE*)&rect.height, &dwSize);
325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( rect.x != (int)CW_USEDEFAULT && (rect.x < -200 || rect.x > 3000) )
327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            rect.x = 100;
328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( rect.y != (int)CW_USEDEFAULT && (rect.y < -200 || rect.y > 3000) )
329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            rect.y = 100;
330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( rect.width != (int)CW_USEDEFAULT && (rect.width < 0 || rect.width > 3000) )
332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            rect.width = 100;
333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( rect.height != (int)CW_USEDEFAULT && (rect.height < 0 || rect.height > 3000) )
334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            rect.height = 100;
335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RegCloseKey(hkey);
337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Window positions saving/loading added by Philip Gruebele.
342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//<a href="mailto:pgruebele@cox.net">pgruebele@cox.net</a>
343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// philipg.  Saves the window position in the registry
344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void
345793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslericvSaveWindowPos( const char* name, CvRect rect )
346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    static const DWORD MAX_RECORD_COUNT = 100;
348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HKEY hkey;
349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    char szKey[1024];
350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    char rootKey[1024];
351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    strcpy( szKey, icvWindowPosRootKey );
352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    strcat( szKey, name );
353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( RegOpenKeyEx( HKEY_CURRENT_USER,szKey,0,KEY_READ,&hkey) != ERROR_SUCCESS )
355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        HKEY hroot;
357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        DWORD count = 0;
358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        FILETIME oldestTime = { UINT_MAX, UINT_MAX };
359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        char oldestKey[1024];
360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        char currentKey[1024];
361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        strcpy( rootKey, icvWindowPosRootKey );
363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        rootKey[strlen(rootKey)-1] = '\0';
364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( RegCreateKeyEx(HKEY_CURRENT_USER, rootKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ+KEY_WRITE, 0, &hroot, NULL) != ERROR_SUCCESS )
365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            //RegOpenKeyEx( HKEY_CURRENT_USER,rootKey,0,KEY_READ,&hroot) != ERROR_SUCCESS )
366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return;
367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for(;;)
369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            DWORD csize = sizeof(currentKey);
371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            FILETIME accesstime = { 0, 0 };
372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            LONG code = RegEnumKeyEx( hroot, count, currentKey, &csize, NULL, NULL, NULL, &accesstime );
373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if( code != ERROR_SUCCESS && code != ERROR_MORE_DATA )
374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            count++;
376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if( oldestTime.dwHighDateTime > accesstime.dwHighDateTime ||
377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                (oldestTime.dwHighDateTime == accesstime.dwHighDateTime &&
378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                oldestTime.dwLowDateTime > accesstime.dwLowDateTime) )
379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                oldestTime = accesstime;
381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                strcpy( oldestKey, currentKey );
382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( count >= MAX_RECORD_COUNT )
386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            RegDeleteKey( hroot, oldestKey );
387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RegCloseKey( hroot );
388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( RegCreateKeyEx(HKEY_CURRENT_USER,szKey,0,NULL,REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hkey, NULL) != ERROR_SUCCESS )
390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return;
391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RegCloseKey( hkey );
395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( RegOpenKeyEx( HKEY_CURRENT_USER,szKey,0,KEY_WRITE,&hkey) != ERROR_SUCCESS )
396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return;
397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RegSetValueEx(hkey, "Left", 0, REG_DWORD, (BYTE*)&rect.x, sizeof(rect.x));
400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RegSetValueEx(hkey, "Top", 0, REG_DWORD, (BYTE*)&rect.y, sizeof(rect.y));
401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RegSetValueEx(hkey, "Width", 0, REG_DWORD, (BYTE*)&rect.width, sizeof(rect.width));
402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RegSetValueEx(hkey, "Height", 0, REG_DWORD, (BYTE*)&rect.height, sizeof(rect.height));
403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RegCloseKey(hkey);
404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdouble cvGetModeWindow_W32(const char* name)//YV
407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double result = -1;
409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvGetModeWindow_W32" );
411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!name)
417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name string" );
418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( name );
420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window)
421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT; // keep silence here
422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result = window->status;
424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid cvSetModeWindow_W32( const char* name, double prop_value)//Yannick Verdie
430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvSetModeWindow_W32" );
432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(!name)
438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name string" );
439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( name );
441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !window )
442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL window" );
443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(window->flags & CV_WINDOW_AUTOSIZE)//if the flag CV_WINDOW_AUTOSIZE is set
445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        DWORD dwStyle = (DWORD)GetWindowLongPtr(window->frame, GWL_STYLE);
449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CvRect position;
450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (window->status==CV_WINDOW_FULLSCREEN && prop_value==CV_WINDOW_NORMAL)
452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            icvLoadWindowPos(window->name,position );
454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SetWindowLongPtr(window->frame, GWL_STYLE, dwStyle | WS_CAPTION | WS_THICKFRAME);
455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SetWindowPos(window->frame, HWND_TOP, position.x, position.y , position.width,position.height, SWP_NOZORDER | SWP_FRAMECHANGED);
457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            window->status=CV_WINDOW_NORMAL;
458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            EXIT;
460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (window->status==CV_WINDOW_NORMAL && prop_value==CV_WINDOW_FULLSCREEN)
463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            //save dimension
465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            RECT rect;
466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            GetWindowRect(window->frame, &rect);
467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CvRect RectCV = cvRect(rect.left, rect.top,rect.right - rect.left, rect.bottom - rect.top);
468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            icvSaveWindowPos(window->name,RectCV );
469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            //Look at coordinate for fullscreen
471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            HMONITOR hMonitor;
472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            MONITORINFO mi;
473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            hMonitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST);
474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            mi.cbSize = sizeof(mi);
476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            GetMonitorInfo(hMonitor, &mi);
477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            //fullscreen
479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            position.x=mi.rcMonitor.left;position.y=mi.rcMonitor.top;
480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            position.width=mi.rcMonitor.right - mi.rcMonitor.left;position.height=mi.rcMonitor.bottom - mi.rcMonitor.top;
481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SetWindowLongPtr(window->frame, GWL_STYLE, dwStyle & ~WS_CAPTION & ~WS_THICKFRAME);
482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SetWindowPos(window->frame, HWND_TOP, position.x, position.y , position.width,position.height, SWP_NOZORDER | SWP_FRAMECHANGED);
484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            window->status=CV_WINDOW_FULLSCREEN;
485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            EXIT;
487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid cv::setWindowTitle(const String& winname, const String& title)
494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window = icvFindWindowByName(winname.c_str());
496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window)
498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        namedWindow(winname);
500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window = icvFindWindowByName(winname.c_str());
501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window)
504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_Error(Error::StsNullPtr, "NULL window");
505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!SetWindowText(window->frame, title.c_str()))
507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_Error_(Error::StsError, ("Failed to set \"%s\" window title to \"%s\"", winname.c_str(), title.c_str()));
508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdouble cvGetPropWindowAutoSize_W32(const char* name)
511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double result = -1;
513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvSetCloseCallback" );
515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!name)
521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name string" );
522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( name );
524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window)
525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT; // keep silence here
526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result = window->flags & CV_WINDOW_AUTOSIZE;
528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdouble cvGetRatioWindow_W32(const char* name)
535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double result = -1;
537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvGetRatioWindow_W32" );
539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!name)
545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name string" );
546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( name );
548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window)
549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT; // keep silence here
550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result = static_cast<double>(window->width) / window->height;
552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdouble cvGetOpenGlProp_W32(const char* name)
559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    double result = -1;
561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvGetOpenGlProp_W32" );
564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!name)
570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name string" );
571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( name );
573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window)
574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT; // keep silence here
575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result = window->useGl;
577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (void)name;
581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// OpenGL support
587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace
591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void createGlContext(HWND hWnd, HDC& hGLDC, HGLRC& hGLRC, bool& useGl)
593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_FUNCNAME( "createGlContext" );
595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        __BEGIN__;
597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        useGl = false;
599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int PixelFormat;
601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        static PIXELFORMATDESCRIPTOR pfd =
603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            1,                             // Version Number
606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            PFD_DRAW_TO_WINDOW |           // Format Must Support Window
607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            PFD_SUPPORT_OPENGL |           // Format Must Support OpenGL
608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            PFD_DOUBLEBUFFER,              // Must Support Double Buffering
609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            PFD_TYPE_RGBA,                 // Request An RGBA Format
610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            32,                            // Select Our Color Depth
611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            0, 0, 0, 0, 0, 0,              // Color Bits Ignored
612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            0,                             // No Alpha Buffer
613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            0,                             // Shift Bit Ignored
614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            0,                             // No Accumulation Buffer
615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            0, 0, 0, 0,                    // Accumulation Bits Ignored
616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            32,                            // 32 Bit Z-Buffer (Depth Buffer)
617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            0,                             // No Stencil Buffer
618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            0,                             // No Auxiliary Buffer
619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            PFD_MAIN_PLANE,                // Main Drawing Layer
620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            0,                             // Reserved
621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            0, 0, 0                        // Layer Masks Ignored
622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        };
623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        hGLDC = GetDC(hWnd);
625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!hGLDC)
626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CV_ERROR( CV_OpenGlApiCallError, "Can't Create A GL Device Context" );
627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        PixelFormat = ChoosePixelFormat(hGLDC, &pfd);
629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!PixelFormat)
630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CV_ERROR( CV_OpenGlApiCallError, "Can't Find A Suitable PixelFormat" );
631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!SetPixelFormat(hGLDC, PixelFormat, &pfd))
633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CV_ERROR( CV_OpenGlApiCallError, "Can't Set The PixelFormat" );
634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        hGLRC = wglCreateContext(hGLDC);
636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!hGLRC)
637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CV_ERROR( CV_OpenGlApiCallError, "Can't Create A GL Rendering Context" );
638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!wglMakeCurrent(hGLDC, hGLRC))
640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CV_ERROR( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" );
641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        useGl = true;
643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        __END__;
645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void releaseGlContext(CvWindow* window)
648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        //CV_FUNCNAME( "releaseGlContext" );
650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        __BEGIN__;
652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (window->hGLRC)
654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            wglDeleteContext(window->hGLRC);
656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            window->hGLRC = NULL;
657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (window->dc)
660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ReleaseDC(window->hwnd, window->dc);
662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            window->dc = NULL;
663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->useGl = false;
666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        __END__;
668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void drawGl(CvWindow* window)
671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_FUNCNAME( "drawGl" );
673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        __BEGIN__;
675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!wglMakeCurrent(window->dc, window->hGLRC))
677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CV_ERROR( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" );
678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (window->glDrawCallback)
682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            window->glDrawCallback(window->glDrawData);
683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!SwapBuffers(window->dc))
685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CV_ERROR( CV_OpenGlApiCallError, "Can't swap OpenGL buffers" );
686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        __END__;
688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void resizeGl(CvWindow* window)
691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_FUNCNAME( "resizeGl" );
693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        __BEGIN__;
695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (!wglMakeCurrent(window->dc, window->hGLRC))
697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CV_ERROR( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" );
698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        glViewport(0, 0, window->width, window->height);
700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        __END__;
702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif // HAVE_OPENGL
706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
708793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int cvNamedWindow( const char* name, int flags )
709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int result = 0;
711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvNamedWindow" );
712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HWND hWnd, mainhWnd;
716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    DWORD defStyle = WS_VISIBLE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;
718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int len;
719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvRect rect;
720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool useGl;
722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HDC hGLDC;
723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HGLRC hGLRC;
724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cvInitSystem(0,0);
727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !name )
729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name string" );
730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Check the name in the storage
732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( name );
733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (window != 0)
734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        result = 1;
736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !(flags & CV_WINDOW_AUTOSIZE))//YV add border in order to resize the window
740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       defStyle |= WS_SIZEBOX;
741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (flags & CV_WINDOW_OPENGL)
744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        defStyle |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    icvLoadWindowPos( name, rect );
748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    mainhWnd = CreateWindow( "Main HighGUI class", name, defStyle | WS_OVERLAPPED,
750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                             rect.x, rect.y, rect.width, rect.height, 0, 0, hg_hinstance, 0 );
751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !mainhWnd )
752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsError, "Frame window can not be created" );
753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ShowWindow(mainhWnd, SW_SHOW);
755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //YV- remove one border by changing the style
757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hWnd = CreateWindow("HighGUI class", "", (defStyle & ~WS_SIZEBOX) | WS_CHILD, CW_USEDEFAULT, 0, rect.width, rect.height, mainhWnd, 0, hg_hinstance, 0);
758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !hWnd )
759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsError, "Frame window can not be created" );
760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef HAVE_OPENGL
762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (flags & CV_WINDOW_OPENGL)
763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_OpenGlNotSupported, "Library was built without OpenGL support" );
764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    useGl = false;
766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hGLDC = 0;
767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hGLRC = 0;
768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (flags & CV_WINDOW_OPENGL)
770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        createGlContext(hWnd, hGLDC, hGLRC, useGl);
771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ShowWindow(hWnd, SW_SHOW);
774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    len = (int)strlen(name);
776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_CALL( window = (CvWindow*)cvAlloc(sizeof(CvWindow) + len + 1));
777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->signature = CV_WINDOW_MAGIC_VAL;
779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->hwnd = hWnd;
780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->frame = mainhWnd;
781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->name = (char*)(window + 1);
782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    memcpy( window->name, name, len + 1 );
783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->flags = flags;
784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->image = 0;
785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef HAVE_OPENGL
787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->dc = CreateCompatibleDC(0);
788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!useGl)
790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->dc = CreateCompatibleDC(0);
792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->hGLRC = 0;
793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->useGl = false;
794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->dc = hGLDC;
798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->hGLRC = hGLRC;
799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->useGl = true;
800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->glDrawCallback = 0;
803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->glDrawData = 0;
804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->last_key = 0;
807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->status = CV_WINDOW_NORMAL;//YV
808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->on_mouse = 0;
810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->on_mouse_param = 0;
811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    memset( &window->toolbar, 0, sizeof(window->toolbar));
813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->next = hg_windows;
815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->prev = 0;
816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( hg_windows )
817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        hg_windows->prev = window;
818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hg_windows = window;
819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    icvSetWindowLongPtr( hWnd, CV_USERDATA, window );
820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    icvSetWindowLongPtr( mainhWnd, CV_USERDATA, window );
821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Recalculate window pos
823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    icvUpdateWindowPos( window );
824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result = 1;
826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
833793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvSetOpenGlContext(const char* name)
834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvSetOpenGlContext" );
836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(!name)
842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name string" );
843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( name );
845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window)
846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL window" );
847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window->useGl)
849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_OpenGlNotSupported, "Window doesn't support OpenGL" );
850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!wglMakeCurrent(window->dc, window->hGLRC))
852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_OpenGlApiCallError, "Can't Activate The GL Rendering Context" );
853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
857793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvUpdateWindow(const char* name)
858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvUpdateWindow" );
860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!name)
866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name string" );
867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( name );
869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window)
870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    InvalidateRect(window->hwnd, 0, 0);
873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
877793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvSetOpenGlDrawCallback(const char* name, CvOpenGlDrawCallback callback, void* userdata)
878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvCreateOpenGLCallback" );
880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(!name)
886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name string" );
887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( name );
889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !window )
890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window->useGl)
893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_OpenGlNotSupported, "Window was created without OpenGL context" );
894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->glDrawCallback = callback;
896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->glDrawData = userdata;
897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif // HAVE_OPENGL
902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvRemoveWindow( CvWindow* window )
904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvTrackbar* trackbar = NULL;
906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RECT wrect={0,0,0,0};
907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (window->useGl)
910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        releaseGlContext(window);
911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window->frame )
914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        GetWindowRect( window->frame, &wrect );
915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window->name )
916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvSaveWindowPos( window->name, cvRect(wrect.left, wrect.top,
917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            wrect.right-wrect.left, wrect.bottom-wrect.top) );
918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window->hwnd )
920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvSetWindowLongPtr( window->hwnd, CV_USERDATA, 0 );
921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window->frame )
922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvSetWindowLongPtr( window->frame, CV_USERDATA, 0 );
923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window->toolbar.toolbar )
925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvSetWindowLongPtr(window->toolbar.toolbar, CV_USERDATA, 0);
926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window->prev )
928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->prev->next = window->next;
929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        hg_windows = window->next;
931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window->next )
933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->next->prev = window->prev;
934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->prev = window->next = 0;
936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window->dc && window->image )
938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        DeleteObject(SelectObject(window->dc,window->image));
939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window->dc )
941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        DeleteDC(window->dc);
942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for( trackbar = window->toolbar.first; trackbar != 0; )
944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CvTrackbar* next = trackbar->next;
946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( trackbar->hwnd )
947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            icvSetWindowLongPtr( trackbar->hwnd, CV_USERDATA, 0 );
949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            cvFree( &trackbar );
950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar = next;
952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cvFree( &window );
955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
958793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvDestroyWindow( const char* name )
959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvDestroyWindow" );
961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HWND mainhWnd;
966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(!name)
968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name string" );
969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( name );
971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !window )
972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    mainhWnd = window->frame;
975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SendMessage(window->hwnd, WM_CLOSE, 0, 0);
977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SendMessage( mainhWnd, WM_CLOSE, 0, 0);
978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Do NOT call _remove_window -- CvWindow list will be updated automatically ...
979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
982793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvScreenToClient( HWND hwnd, RECT* rect )
985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    POINT p;
987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    p.x = rect->left;
988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    p.y = rect->top;
989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ScreenToClient(hwnd, &p);
990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    OffsetRect( rect, p.x - rect->left, p.y - rect->top );
991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
994793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Calculatess the window coordinates relative to the upper left corner of the mainhWnd window */
995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic RECT icvCalcWindowRect( CvWindow* window )
996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const int gutter = 1;
998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RECT crect, trect, rect;
999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(window);
1001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    GetClientRect(window->frame, &crect);
1003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(window->toolbar.toolbar)
1004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        GetWindowRect(window->toolbar.toolbar, &trect);
1006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvScreenToClient(window->frame, &trect);
1007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SubtractRect( &rect, &crect, &trect);
1008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
1010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        rect = crect;
1011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rect.top += gutter;
1013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rect.left += gutter;
1014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rect.bottom -= gutter;
1015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rect.right -= gutter;
1016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return rect;
1018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// returns TRUE if there is a problem such as ERROR_IO_PENDING.
1021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic bool icvGetBitmapData( CvWindow* window, SIZE* size, int* channels, void** data )
1022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    BITMAP bmp;
1024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    GdiFlush();
1025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HGDIOBJ h = GetCurrentObject( window->dc, OBJ_BITMAP );
1026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( size )
1027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        size->cx = size->cy = 0;
1028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( data )
1029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *data = 0;
1030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (h == NULL)
1032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return true;
1033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (GetObject(h, sizeof(bmp), &bmp) == 0)
1034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return true;
1035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( size )
1037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        size->cx = abs(bmp.bmWidth);
1039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        size->cy = abs(bmp.bmHeight);
1040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( channels )
1043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *channels = bmp.bmBitsPixel/8;
1044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( data )
1046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *data = bmp.bmBits;
1047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return false;
1049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvUpdateWindowPos( CvWindow* window )
1053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RECT rect;
1055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    assert(window);
1056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( (window->flags & CV_WINDOW_AUTOSIZE) && window->image )
1058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int i;
1060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SIZE size = {0,0};
1061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvGetBitmapData( window, &size, 0, 0 );
1062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Repeat two times because after the first resizing of the mainhWnd window
1064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // toolbar may resize too
1065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for(i = 0; i < (window->toolbar.toolbar ? 2 : 1); i++)
1066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            RECT rmw, rw = icvCalcWindowRect(window );
1068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            MoveWindow(window->hwnd, rw.left, rw.top,
1069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                rw.right - rw.left + 1, rw.bottom - rw.top + 1, FALSE);
1070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            GetClientRect(window->hwnd, &rw);
1071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            GetWindowRect(window->frame, &rmw);
1072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // Resize the mainhWnd window in order to make the bitmap fit into the child window
1073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            MoveWindow(window->frame, rmw.left, rmw.top,
1074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                rmw.right - rmw.left + size.cx - rw.right + rw.left,
1075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                rmw.bottom  - rmw.top + size.cy - rw.bottom + rw.top, TRUE );
1076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rect = icvCalcWindowRect(window);
1080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    MoveWindow(window->hwnd, rect.left, rect.top,
1081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               rect.right - rect.left + 1,
1082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               rect.bottom - rect.top + 1, TRUE );
1083793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1085793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void
1086793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvShowImage( const char* name, const CvArr* arr )
1087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvShowImage" );
1089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
1091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
1093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SIZE size = { 0, 0 };
1094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int channels = 0;
1095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* dst_ptr = 0;
1096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const int channels0 = 3;
1097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int origin = 0;
1098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvMat stub, dst, *image;
1099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool changed_size = false; // philipg
1100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !name )
1102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name" );
1103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName(name);
1105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(!window)
1106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cvNamedWindow(name, CV_WINDOW_AUTOSIZE);
1108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window = icvFindWindowByName(name);
1109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !window || !arr )
1112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT; // keep silence here.
1113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( CV_IS_IMAGE_HDR( arr ))
1115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        origin = ((IplImage*)arr)->origin;
1116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_CALL( image = cvGetMat( arr, &stub ));
1118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
1120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (window->useGl)
1121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cv::imshow(name, cv::cvarrToMat(image));
1123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return;
1124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (window->image)
1128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // if there is something wrong with these system calls, we cannot display image...
1129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (icvGetBitmapData( window, &size, &channels, &dst_ptr ))
1130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return;
1131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( size.cx != image->width || size.cy != image->height || channels != channels0 )
1133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        changed_size = true;
1135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uchar buffer[sizeof(BITMAPINFO) + 255*sizeof(RGBQUAD)];
1137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        BITMAPINFO* binfo = (BITMAPINFO*)buffer;
1138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        DeleteObject( SelectObject( window->dc, window->image ));
1140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->image = 0;
1141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        size.cx = image->width;
1143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        size.cy = image->height;
1144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        channels = channels0;
1145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        FillBitmapInfo( binfo, size.cx, size.cy, channels*8, 1 );
1147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->image = SelectObject( window->dc, CreateDIBSection(window->dc, binfo,
1149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                      DIB_RGB_COLORS, &dst_ptr, 0, 0));
1150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cvInitMatHeader( &dst, size.cy, size.cx, CV_8UC3,
1153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     dst_ptr, (size.cx * channels + 3) & -4 );
1154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cvConvertImage( image, &dst, origin == 0 ? CV_CVTIMG_FLIP : 0 );
1155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // ony resize window if needed
1157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (changed_size)
1158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvUpdateWindowPos(window);
1159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    InvalidateRect(window->hwnd, 0, 0);
1160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // philipg: this is not needed and just slows things down
1161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //    UpdateWindow(window->hwnd);
1162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
1164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if 0
1167793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void
1168793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvShowImageHWND(HWND w_hWnd, const CvArr* arr)
1169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvShowImageHWND" );
1171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
1173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SIZE size = { 0, 0 };
1175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int channels = 0;
1176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* dst_ptr = 0;
1177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const int channels0 = 3;
1178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int origin = 0;
1179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvMat stub, dst, *image;
1180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bool changed_size = false;
1181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    BITMAPINFO tempbinfo;
1182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    HDC hdc = NULL;
1183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !arr )
1185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
1186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !w_hWnd )
1187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
1188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hdc = GetDC(w_hWnd);
1190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( CV_IS_IMAGE_HDR( arr ) )
1192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        origin = ((IplImage*)arr)->origin;
1193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_CALL( image = cvGetMat( arr, &stub ) );
1195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ( hdc )
1197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            //GetBitmapData
1199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            BITMAP bmp;
1200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            GdiFlush();
1201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            HGDIOBJ h = GetCurrentObject( hdc, OBJ_BITMAP );
1202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (h == NULL)
1204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            EXIT;
1205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (GetObject(h, sizeof(bmp), &bmp) == 0) //GetObject(): returns size of object, 0 if error
1206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            EXIT;
1207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            channels = bmp.bmBitsPixel/8;
1209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            dst_ptr = bmp.bmBits;
1210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     }
1211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( size.cx != image->width || size.cy != image->height || channels != channels0 )
1213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        changed_size = true;
1215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        uchar buffer[sizeof(BITMAPINFO) + 255*sizeof(RGBQUAD)];
1217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        BITMAPINFO* binfo = (BITMAPINFO*)buffer;
1218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        BOOL bDeleteObj = DeleteObject(GetCurrentObject(hdc, OBJ_BITMAP));
1220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                CV_Assert( FALSE != bDeleteObj );
1221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        size.cx = image->width;
1223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        size.cy = image->height;
1224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        channels = channels0;
1225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        FillBitmapInfo( binfo, size.cx, size.cy, channels*8, 1 );
1227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SelectObject( hdc, CreateDIBSection( hdc, binfo, DIB_RGB_COLORS, &dst_ptr, 0, 0));
1229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cvInitMatHeader( &dst, size.cy, size.cx, CV_8UC3, dst_ptr, (size.cx * channels + 3) & -4 );
1232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cvConvertImage( image, &dst, origin == 0 ? CV_CVTIMG_FLIP : 0 );
1233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Image stretching to fit the window
1235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RECT rect;
1236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    GetClientRect(w_hWnd, &rect);
1237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    StretchDIBits( hdc, 0, 0, rect.right, rect.bottom, 0, 0, image->width, image->height, dst_ptr, &tempbinfo, DIB_RGB_COLORS, SRCCOPY );
1238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // ony resize window if needed
1240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    InvalidateRect(w_hWnd, 0, 0);
1241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
1243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1246793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvResizeWindow(const char* name, int width, int height )
1247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvResizeWindow" );
1249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
1251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int i;
1253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
1254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RECT rmw, rw, rect;
1255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !name )
1257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name" );
1258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName(name);
1260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(!window)
1261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
1262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Repeat two times because after the first resizing of the mainhWnd window
1264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // toolbar may resize too
1265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for(i = 0; i < (window->toolbar.toolbar ? 2 : 1); i++)
1266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        rw = icvCalcWindowRect(window);
1268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        MoveWindow(window->hwnd, rw.left, rw.top,
1269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            rw.right - rw.left + 1, rw.bottom - rw.top + 1, FALSE);
1270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        GetClientRect(window->hwnd, &rw);
1271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        GetWindowRect(window->frame, &rmw);
1272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Resize the mainhWnd window in order to make the bitmap fit into the child window
1273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        MoveWindow(window->frame, rmw.left, rmw.top,
1274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            rmw.right - rmw.left + width - rw.right + rw.left,
1275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            rmw.bottom  - rmw.top + height - rw.bottom + rw.top, TRUE);
1276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rect = icvCalcWindowRect(window);
1279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    MoveWindow(window->hwnd, rect.left, rect.top,
1280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE);
1281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
1283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1286793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvMoveWindow( const char* name, int x, int y )
1287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvMoveWindow" );
1289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
1291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
1293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RECT rect;
1294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !name )
1296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL name" );
1297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName(name);
1299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(!window)
1300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
1301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    GetWindowRect( window->frame, &rect );
1303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    MoveWindow( window->frame, x, y, rect.right - rect.left, rect.bottom - rect.top, TRUE);
1304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
1306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK
1310793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMainWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
1311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window = icvWindowByHWND( hwnd );
1313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !window )
1314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return DefWindowProc(hwnd, uMsg, wParam, lParam);
1315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch(uMsg)
1317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_COPY:
1319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ::SendMessage(window->hwnd, uMsg, wParam, lParam);
1320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
1321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_DESTROY:
1323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvRemoveWindow(window);
1325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Do nothing!!!
1326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        //PostQuitMessage(0);
1327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
1328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_GETMINMAXINFO:
1330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( !(window->flags & CV_WINDOW_AUTOSIZE) )
1331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            MINMAXINFO* minmax = (MINMAXINFO*)lParam;
1333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            RECT rect;
1334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            LRESULT retval = DefWindowProc(hwnd, uMsg, wParam, lParam);
1335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            minmax->ptMinTrackSize.y = 100;
1337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            minmax->ptMinTrackSize.x = 100;
1338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if( window->toolbar.first )
1340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                GetWindowRect( window->toolbar.first->hwnd, &rect );
1342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                minmax->ptMinTrackSize.y += window->toolbar.rows*(rect.bottom - rect.top);
1343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                minmax->ptMinTrackSize.x = MAX(rect.right - rect.left + HG_BUDDY_WIDTH, HG_BUDDY_WIDTH*2);
1344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return retval;
1346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
1348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_WINDOWPOSCHANGED:
1350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            WINDOWPOS* pos = (WINDOWPOS*)lParam;
1352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // Update the toolbar pos/size
1354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if(window->toolbar.toolbar)
1355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                RECT rect;
1357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                GetWindowRect(window->toolbar.toolbar, &rect);
1358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                MoveWindow(window->toolbar.toolbar, 0, 0, pos->cx, rect.bottom - rect.top, TRUE);
1359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if(!(window->flags & CV_WINDOW_AUTOSIZE))
1362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                icvUpdateWindowPos(window);
1363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_WINDOWPOSCHANGING:
1368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       {
1369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          // Snap window to screen edges with multi-monitor support. // Adi Shavit
1370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          LPWINDOWPOS pos = (LPWINDOWPOS)lParam;
1371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          RECT rect;
1373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          GetWindowRect(window->frame, &rect);
1374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          HMONITOR hMonitor;
1376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          hMonitor = MonitorFromRect(&rect, MONITOR_DEFAULTTONEAREST);
1377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          MONITORINFO mi;
1379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          mi.cbSize = sizeof(mi);
1380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          GetMonitorInfo(hMonitor, &mi);
1381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          const int SNAP_DISTANCE = 15;
1383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          if (abs(pos->x - mi.rcMonitor.left) <= SNAP_DISTANCE)
1385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             pos->x = mi.rcMonitor.left;               // snap to left edge
1386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          else
1387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             if (abs(pos->x + pos->cx - mi.rcMonitor.right) <= SNAP_DISTANCE)
1388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                pos->x = mi.rcMonitor.right - pos->cx; // snap to right edge
1389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          if (abs(pos->y - mi.rcMonitor.top) <= SNAP_DISTANCE)
1391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             pos->y = mi.rcMonitor.top;                 // snap to top edge
1392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          else
1393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             if (abs(pos->y + pos->cy - mi.rcMonitor.bottom) <= SNAP_DISTANCE)
1394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                pos->y = mi.rcMonitor.bottom - pos->cy; // snap to bottom edge
1395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       }
1396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_ACTIVATE:
1398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if(LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE)
1399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SetFocus(window->hwnd);
1400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
1401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_MOUSEWHEEL:
1403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_MOUSEHWHEEL:
1404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       if( window->on_mouse )
1405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       {
1406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          int flags = (wParam & MK_LBUTTON      ? CV_EVENT_FLAG_LBUTTON  : 0)|
1407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      (wParam & MK_RBUTTON      ? CV_EVENT_FLAG_RBUTTON  : 0)|
1408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      (wParam & MK_MBUTTON      ? CV_EVENT_FLAG_MBUTTON  : 0)|
1409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      (wParam & MK_CONTROL      ? CV_EVENT_FLAG_CTRLKEY  : 0)|
1410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      (wParam & MK_SHIFT        ? CV_EVENT_FLAG_SHIFTKEY : 0)|
1411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      (GetKeyState(VK_MENU) < 0 ? CV_EVENT_FLAG_ALTKEY   : 0);
1412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          int event = (uMsg == WM_MOUSEWHEEL    ? CV_EVENT_MOUSEWHEEL    : CV_EVENT_MOUSEHWHEEL);
1413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          // Set the wheel delta of mouse wheel to be in the upper word of 'event'
1415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          int delta = GET_WHEEL_DELTA_WPARAM(wParam);
1416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          flags |= (delta << 16);
1417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          POINT pt;
1419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          pt.x = GET_X_LPARAM( lParam );
1420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          pt.y = GET_Y_LPARAM( lParam );
1421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          ::ScreenToClient(hwnd, &pt); // Convert screen coordinates to client coordinates.
1422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          RECT rect;
1424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          GetClientRect( window->hwnd, &rect );
1425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          SIZE size = {0,0};
1427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          icvGetBitmapData( window, &size, 0, 0 );
1428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          window->on_mouse( event, pt.x*size.cx/MAX(rect.right - rect.left,1),
1430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                   pt.y*size.cy/MAX(rect.bottom - rect.top,1), flags,
1431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                   window->on_mouse_param );
1432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       }
1433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler       break;
1434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_ERASEBKGND:
1436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            RECT cr, tr, wrc;
1438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            HRGN rgn, rgn1, rgn2;
1439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            int ret;
1440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            HDC hdc = (HDC)wParam;
1441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            GetWindowRect(window->hwnd, &cr);
1442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            icvScreenToClient(window->frame, &cr);
1443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if(window->toolbar.toolbar)
1444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                GetWindowRect(window->toolbar.toolbar, &tr);
1446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                icvScreenToClient(window->frame, &tr);
1447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            else
1449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                tr.left = tr.top = tr.right = tr.bottom = 0;
1450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            GetClientRect(window->frame, &wrc);
1452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            rgn = CreateRectRgn(0, 0, wrc.right, wrc.bottom);
1454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            rgn1 = CreateRectRgn(cr.left, cr.top, cr.right, cr.bottom);
1455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            rgn2 = CreateRectRgn(tr.left, tr.top, tr.right, tr.bottom);
1456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ret = CombineRgn(rgn, rgn, rgn1, RGN_DIFF);
1457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ret = CombineRgn(rgn, rgn, rgn2, RGN_DIFF);
1458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if(ret != NULLREGION && ret != ERROR)
1460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                FillRgn(hdc, rgn, (HBRUSH)icvGetClassLongPtr(hwnd, CV_HBRBACKGROUND));
1461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            DeleteObject(rgn);
1463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            DeleteObject(rgn1);
1464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            DeleteObject(rgn2);
1465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 1;
1467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return DefWindowProc(hwnd, uMsg, wParam, lParam);
1470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK HighGUIProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
1474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window = icvWindowByHWND(hwnd);
1476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !window )
1477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // This window is not mentioned in HighGUI storage
1478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Actually, this should be error except for the case of calls to CreateWindow
1479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return DefWindowProc(hwnd, uMsg, wParam, lParam);
1480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Process the message
1482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch(uMsg)
1483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_COPY:
1485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (!::OpenClipboard(hwnd) )
1487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                break;
1488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            HDC hDC       = 0;
1490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            HDC memDC     = 0;
1491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            HBITMAP memBM = 0;
1492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // We'll use a do-while(0){} scope as a single-run breakable scope
1494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // Upon any error we can jump out of the single-time while scope to clean up the resources.
1495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            do
1496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!::EmptyClipboard())
1498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
1499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if(!window->image)
1501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
1502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // Get window device context
1504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (0 == (hDC = ::GetDC(hwnd)))
1505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
1506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // Create another DC compatible with hDC
1508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (0 == (memDC = ::CreateCompatibleDC( hDC )))
1509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
1510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // Determine the bitmap's dimensions
1512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int nchannels = 3;
1513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                SIZE size = {0,0};
1514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                icvGetBitmapData( window, &size, &nchannels, 0 );
1515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // Create bitmap to draw on and it in the new DC
1517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (0 == (memBM = ::CreateCompatibleBitmap ( hDC, size.cx, size.cy)))
1518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
1519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!::SelectObject( memDC, memBM ))
1521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
1522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // Begin drawing to DC
1524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!::SetStretchBltMode(memDC, COLORONCOLOR))
1525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
1526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                RGBQUAD table[256];
1528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if( 1 == nchannels )
1529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    for(int i = 0; i < 256; ++i)
1531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
1532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        table[i].rgbBlue = (unsigned char)i;
1533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        table[i].rgbGreen = (unsigned char)i;
1534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        table[i].rgbRed = (unsigned char)i;
1535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
1536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if (!::SetDIBColorTable(window->dc, 0, 255, table))
1537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        break;
1538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // The image copied to the clipboard will be in its original size, regardless if the window itself was resized.
1541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // Render the image to the dc/bitmap (at original size).
1543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if (!::BitBlt( memDC, 0, 0, size.cx, size.cy, window->dc, 0, 0, SRCCOPY ))
1544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
1545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // Finally, set bitmap to clipboard
1547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ::SetClipboardData(CF_BITMAP, memBM);
1548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            } while (0,0); // (0,0) instead of (0) to avoid MSVC compiler warning C4127: "conditional expression is constant"
1549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            //////////////////////////////////////////////////////////////////////////
1551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // if handle is allocated (i.e. != 0) then clean-up.
1552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (memBM) ::DeleteObject(memBM);
1553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (memDC) ::DeleteDC(memDC);
1554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (hDC)   ::ReleaseDC(hwnd, hDC);
1555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ::CloseClipboard();
1556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            break;
1557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_WINDOWPOSCHANGING:
1560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            LPWINDOWPOS pos = (LPWINDOWPOS)lParam;
1562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            RECT rect = icvCalcWindowRect(window);
1563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            pos->x = rect.left;
1564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            pos->y = rect.top;
1565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            pos->cx = rect.right - rect.left + 1;
1566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            pos->cy = rect.bottom - rect.top + 1;
1567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
1569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_LBUTTONDOWN:
1571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_RBUTTONDOWN:
1572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_MBUTTONDOWN:
1573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_LBUTTONDBLCLK:
1574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_RBUTTONDBLCLK:
1575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_MBUTTONDBLCLK:
1576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_LBUTTONUP:
1577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_RBUTTONUP:
1578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_MBUTTONUP:
1579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_MOUSEMOVE:
1580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( window->on_mouse )
1581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            POINT pt;
1583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            int flags = (wParam & MK_LBUTTON ? CV_EVENT_FLAG_LBUTTON : 0)|
1585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        (wParam & MK_RBUTTON ? CV_EVENT_FLAG_RBUTTON : 0)|
1586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        (wParam & MK_MBUTTON ? CV_EVENT_FLAG_MBUTTON : 0)|
1587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        (wParam & MK_CONTROL ? CV_EVENT_FLAG_CTRLKEY : 0)|
1588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        (wParam & MK_SHIFT ? CV_EVENT_FLAG_SHIFTKEY : 0)|
1589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        (GetKeyState(VK_MENU) < 0 ? CV_EVENT_FLAG_ALTKEY : 0);
1590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            int event = uMsg == WM_LBUTTONDOWN ? CV_EVENT_LBUTTONDOWN :
1591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        uMsg == WM_RBUTTONDOWN ? CV_EVENT_RBUTTONDOWN :
1592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        uMsg == WM_MBUTTONDOWN ? CV_EVENT_MBUTTONDOWN :
1593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        uMsg == WM_LBUTTONUP ? CV_EVENT_LBUTTONUP :
1594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        uMsg == WM_RBUTTONUP ? CV_EVENT_RBUTTONUP :
1595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        uMsg == WM_MBUTTONUP ? CV_EVENT_MBUTTONUP :
1596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        uMsg == WM_LBUTTONDBLCLK ? CV_EVENT_LBUTTONDBLCLK :
1597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        uMsg == WM_RBUTTONDBLCLK ? CV_EVENT_RBUTTONDBLCLK :
1598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        uMsg == WM_MBUTTONDBLCLK ? CV_EVENT_MBUTTONDBLCLK :
1599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                                   CV_EVENT_MOUSEMOVE;
1600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if( uMsg == WM_LBUTTONDOWN || uMsg == WM_RBUTTONDOWN || uMsg == WM_MBUTTONDOWN )
1601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                SetCapture( hwnd );
1602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if( uMsg == WM_LBUTTONUP || uMsg == WM_RBUTTONUP || uMsg == WM_MBUTTONUP )
1603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ReleaseCapture();
1604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            pt.x = GET_X_LPARAM( lParam );
1606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            pt.y = GET_Y_LPARAM( lParam );
1607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (window->flags & CV_WINDOW_AUTOSIZE)
1609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // As user can't change window size, do not scale window coordinates. Underlying windowing system
1611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // may prevent full window from being displayed and in this case coordinates should not be scaled.
1612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                window->on_mouse( event, pt.x, pt.y, flags, window->on_mouse_param );
1613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            } else {
1614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // Full window is displayed using different size. Scale coordinates to match underlying positions.
1615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                RECT rect;
1616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                SIZE size = {0, 0};
1617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                GetClientRect( window->hwnd, &rect );
1619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                icvGetBitmapData( window, &size, 0, 0 );
1620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                window->on_mouse( event, pt.x*size.cx/MAX(rect.right - rect.left,1),
1622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                         pt.y*size.cy/MAX(rect.bottom - rect.top,1), flags,
1623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                         window->on_mouse_param );
1624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
1627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_PAINT:
1629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if(window->image != 0)
1630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            int nchannels = 3;
1632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SIZE size = {0,0};
1633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            PAINTSTRUCT paint;
1634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            HDC hdc;
1635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            RGBQUAD table[256];
1636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // Determine the bitmap's dimensions
1638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            icvGetBitmapData( window, &size, &nchannels, 0 );
1639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            hdc = BeginPaint(hwnd, &paint);
1641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SetStretchBltMode(hdc, COLORONCOLOR);
1642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if( nchannels == 1 )
1644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                int i;
1646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for(i = 0; i < 256; i++)
1647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    table[i].rgbBlue = (unsigned char)i;
1649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    table[i].rgbGreen = (unsigned char)i;
1650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    table[i].rgbRed = (unsigned char)i;
1651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                SetDIBColorTable(window->dc, 0, 255, table);
1653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if(window->flags & CV_WINDOW_AUTOSIZE)
1656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                BitBlt( hdc, 0, 0, size.cx, size.cy, window->dc, 0, 0, SRCCOPY );
1658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            else
1660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                RECT rect;
1662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                GetClientRect(window->hwnd, &rect);
1663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                StretchBlt( hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top,
1664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            window->dc, 0, 0, size.cx, size.cy, SRCCOPY );
1665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            //DeleteDC(hdc);
1667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            EndPaint(hwnd, &paint);
1668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
1670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else if(window->useGl)
1671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            drawGl(window);
1673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return DefWindowProc(hwnd, uMsg, wParam, lParam);
1674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
1677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return DefWindowProc(hwnd, uMsg, wParam, lParam);
1679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 0;
1681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_ERASEBKGND:
1683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if(window->image)
1684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
1685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
1686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_DESTROY:
1688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvRemoveWindow(window);
1690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Do nothing!!!
1691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        //PostQuitMessage(0);
1692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
1693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_SETCURSOR:
1695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SetCursor((HCURSOR)icvGetClassLongPtr(hwnd, CV_HCURSOR));
1696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 0;
1697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_KEYDOWN:
1699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->last_key = (int)wParam;
1700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return 0;
1701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_SIZE:
1703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->width = LOWORD(lParam);
1704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->height = HIWORD(lParam);
1705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENGL
1707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (window->useGl)
1708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            resizeGl(window);
1709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return DefWindowProc(hwnd, uMsg, wParam, lParam);
1713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
1717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    LRESULT ret;
1719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( hg_on_preprocess )
1721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int was_processed = 0;
1723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int rethg = hg_on_preprocess(hwnd, uMsg, wParam, lParam, &was_processed);
1724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( was_processed )
1725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return rethg;
1726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ret = HighGUIProc(hwnd, uMsg, wParam, lParam);
1728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(hg_on_postprocess)
1730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int was_processed = 0;
1732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int rethg = hg_on_postprocess(hwnd, uMsg, wParam, lParam, &was_processed);
1733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( was_processed )
1734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return rethg;
1735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return ret;
1738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void icvUpdateTrackbar( CvTrackbar* trackbar, int pos )
1742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const int max_name_len = 10;
1744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const char* suffix = "";
1745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    char pos_text[32];
1746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int name_len;
1747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( trackbar->data )
1749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *trackbar->data = pos;
1750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( trackbar->pos != pos )
1752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->pos = pos;
1754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( trackbar->notify2 )
1755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            trackbar->notify2(pos, trackbar->userdata);
1756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( trackbar->notify )
1757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            trackbar->notify(pos);
1758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        name_len = (int)strlen(trackbar->name);
1760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( name_len > max_name_len )
1762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            int start_len = max_name_len*2/3;
1764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            int end_len = max_name_len - start_len - 2;
1765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            memcpy( pos_text, trackbar->name, start_len );
1766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            memcpy( pos_text + start_len, "...", 3 );
1767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            memcpy( pos_text + start_len + 3, trackbar->name + name_len - end_len, end_len + 1 );
1768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
1770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            memcpy( pos_text, trackbar->name, name_len + 1);
1772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sprintf( pos_text + strlen(pos_text), "%s: %d\n", suffix, pos );
1775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SetWindowText( trackbar->buddy, pos_text );
1776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic LRESULT CALLBACK HGToolbarProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
1781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window = icvWindowByHWND( hwnd );
1783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if(!window)
1784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return DefWindowProc(hwnd, uMsg, wParam, lParam);
1785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Control messages processing
1787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch(uMsg)
1788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Slider processing
1790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_HSCROLL:
1791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            HWND slider = (HWND)lParam;
1793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            int pos = (int)SendMessage(slider, TBM_GETPOS, 0, 0);
1794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CvTrackbar* trackbar = icvTrackbarByHWND( slider );
1795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if( trackbar )
1797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if( trackbar->pos != pos )
1799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    icvUpdateTrackbar( trackbar, pos );
1800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SetFocus( window->hwnd );
1803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return 0;
1804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case WM_NCCALCSIZE:
1807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            LRESULT ret = CallWindowProc(window->toolbar.toolBarProc, hwnd, uMsg, wParam, lParam);
1809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            int rows = (int)SendMessage(hwnd, TB_GETROWS, 0, 0);
1810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if(window->toolbar.rows != rows)
1812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                SendMessage(window->toolbar.toolbar, TB_BUTTONCOUNT, 0, 0);
1814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                CvTrackbar* trackbar = window->toolbar.first;
1815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for( ; trackbar != 0; trackbar = trackbar->next )
1817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    RECT rect;
1819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    SendMessage(window->toolbar.toolbar, TB_GETITEMRECT,
1820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                               (WPARAM)trackbar->id, (LPARAM)&rect);
1821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    MoveWindow(trackbar->hwnd, rect.left + HG_BUDDY_WIDTH, rect.top,
1822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                               rect.right - rect.left - HG_BUDDY_WIDTH,
1823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                               rect.bottom - rect.top, FALSE);
1824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    MoveWindow(trackbar->buddy, rect.left, rect.top,
1825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                               HG_BUDDY_WIDTH, rect.bottom - rect.top, FALSE);
1826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                window->toolbar.rows = rows;
1828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return ret;
1830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return CallWindowProc(window->toolbar.toolBarProc, hwnd, uMsg, wParam, lParam);
1834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1837793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void
1838793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvDestroyAllWindows(void)
1839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window = hg_windows;
1841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    while( window )
1843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        HWND mainhWnd = window->frame;
1845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        HWND hwnd = window->hwnd;
1846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window = window->next;
1847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SendMessage( hwnd, WM_CLOSE, 0, 0 );
1849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SendMessage( mainhWnd, WM_CLOSE, 0, 0 );
1850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic void showSaveDialog(CvWindow* window)
1854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (!window || !window->image)
1856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return;
1857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SIZE sz;
1859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int channels;
1860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* data;
1861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (icvGetBitmapData(window, &sz, &channels, &data))
1862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return; // nothing to save
1863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    char szFileName[MAX_PATH] = "";
1865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // try to use window title as file name
1866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    GetWindowText(window->frame, szFileName, MAX_PATH);
1867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    OPENFILENAME ofn;
1869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ZeroMemory(&ofn, sizeof(ofn));
1870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef OPENFILENAME_SIZE_VERSION_400
1871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // we are not going to use new fields any way
1872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
1873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
1874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ofn.lStructSize = sizeof(ofn);
1875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
1876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ofn.hwndOwner = window->hwnd;
1877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ofn.lpstrFilter = "Portable Network Graphics files (*.png)\0*.png\0"
1878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      "JPEG files (*.jpeg;*.jpg;*.jpe)\0*.jpeg;*.jpg;*.jpe\0"
1879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      "Windows bitmap (*.bmp;*.dib)\0*.bmp;*.dib\0"
1880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      "TIFF Files (*.tiff;*.tif)\0*.tiff;*.tif\0"
1881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      "JPEG-2000 files (*.jp2)\0*.jp2\0"
1882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      "WebP files (*.webp)\0*.webp\0"
1883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      "Portable image format (*.pbm;*.pgm;*.ppm;*.pxm;*.pnm)\0*.pbm;*.pgm;*.ppm;*.pxm;*.pnm\0"
1884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      "OpenEXR Image files (*.exr)\0*.exr\0"
1885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      "Radiance HDR (*.hdr;*.pic)\0*.hdr;*.pic\0"
1886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      "Sun raster files (*.sr;*.ras)\0*.sr;*.ras\0"
1887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      "All Files (*.*)\0*.*\0";
1888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ofn.lpstrFile = szFileName;
1889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ofn.nMaxFile = MAX_PATH;
1890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_NOREADONLYRETURN | OFN_NOCHANGEDIR;
1891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ofn.lpstrDefExt = "png";
1892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (GetSaveFileName(&ofn))
1894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cv::Mat tmp; cv::flip(cv::Mat(sz.cy, sz.cx, CV_8UC(channels), data), tmp, 0);
1896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cv::imwrite(szFileName, tmp);
1897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1900793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int
1901793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvWaitKey( int delay )
1902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int time0 = GetTickCount();
1904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for(;;)
1906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
1907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CvWindow* window;
1908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        MSG message;
1909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int is_processed = 0;
1910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( (delay > 0 && abs((int)(GetTickCount() - time0)) >= delay) || hg_windows == 0 )
1912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return -1;
1913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( delay <= 0 )
1915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            GetMessage(&message, 0, 0, 0);
1916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else if( PeekMessage(&message, 0, 0, 0, PM_REMOVE) == FALSE )
1917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            Sleep(1);
1919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            continue;
1920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for( window = hg_windows; window != 0 && is_processed == 0; window = window->next )
1923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if( window->hwnd == message.hwnd || window->frame == message.hwnd )
1925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
1926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                is_processed = 1;
1927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                switch(message.message)
1928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                {
1929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                case WM_DESTROY:
1930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                case WM_CHAR:
1931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    DispatchMessage(&message);
1932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    return (int)message.wParam;
1933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                case WM_SYSKEYDOWN:
1935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if( message.wParam == VK_F10 )
1936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
1937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        is_processed = 1;
1938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return (int)(message.wParam << 16);
1939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
1940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
1941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                case WM_KEYDOWN:
1943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    TranslateMessage(&message);
1944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if( (message.wParam >= VK_F1 && message.wParam <= VK_F24)       ||
1945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        message.wParam == VK_HOME   || message.wParam == VK_END     ||
1946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        message.wParam == VK_UP     || message.wParam == VK_DOWN    ||
1947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        message.wParam == VK_LEFT   || message.wParam == VK_RIGHT   ||
1948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        message.wParam == VK_INSERT || message.wParam == VK_DELETE  ||
1949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        message.wParam == VK_PRIOR  || message.wParam == VK_NEXT )
1950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    {
1951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        DispatchMessage(&message);
1952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        is_processed = 1;
1953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        return (int)(message.wParam << 16);
1954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    }
1955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    // Intercept Ctrl+C for copy to clipboard
1957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if ('C' == message.wParam && (::GetKeyState(VK_CONTROL)>>15))
1958793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        ::SendMessage(message.hwnd, WM_COPY, 0, 0);
1959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    // Intercept Ctrl+S for "save as" dialog
1961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if ('S' == message.wParam && (::GetKeyState(VK_CONTROL)>>15))
1962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        showSaveDialog(window);
1963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                default:
1965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    DispatchMessage(&message);
1966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    is_processed = 1;
1967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    break;
1968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                }
1969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
1970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( !is_processed )
1973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
1974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            TranslateMessage(&message);
1975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            DispatchMessage(&message);
1976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
1977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
1978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic CvTrackbar*
1982793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslericvFindTrackbarByName( const CvWindow* window, const char* name )
1983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvTrackbar* trackbar = window->toolbar.first;
1985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for( ; trackbar != 0 && strcmp( trackbar->name, name ) != 0; trackbar = trackbar->next )
1987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ;
1988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return trackbar;
1990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
1991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
1993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstatic int
1994793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslericvCreateTrackbar( const char* trackbar_name, const char* window_name,
1995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                   int* val, int count, CvTrackbarCallback on_notify,
1996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                   CvTrackbarCallback2 on_notify2, void* userdata )
1997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
1998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int result = 0;
1999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "icvCreateTrackbar" );
2001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
2003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    char slider_name[32];
2005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window = 0;
2006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvTrackbar* trackbar = 0;
2007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int pos = 0;
2008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !window_name || !trackbar_name )
2010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL window or trackbar name" );
2011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( count < 0 )
2013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsOutOfRange, "Bad trackbar maximal value" );
2014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName(window_name);
2016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !window )
2017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
2018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    trackbar = icvFindTrackbarByName(window,trackbar_name);
2020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !trackbar )
2021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TBBUTTON tbs = {0};
2023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        TBBUTTONINFO tbis = {0};
2024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        RECT rect;
2025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int bcount;
2026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int len = (int)strlen( trackbar_name );
2027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // create toolbar if it is not created yet
2029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( !window->toolbar.toolbar )
2030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
2031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            const int default_height = 30;
2032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // CreateToolbarEx is deprecated and forces linking against Comctl32.lib.
2034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            window->toolbar.toolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
2035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                        WS_CHILD | CCS_TOP | TBSTYLE_WRAPABLE | BTNS_AUTOSIZE | BTNS_BUTTON,
2036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                        0, 0, 0, 0,
2037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                        window->frame, NULL, GetModuleHandle(NULL), NULL);
2038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // CreateToolbarEx automatically sends this but CreateWindowEx doesn't.
2039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SendMessage(window->toolbar.toolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
2040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            GetClientRect(window->frame, &rect);
2042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            MoveWindow( window->toolbar.toolbar, 0, 0,
2043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        rect.right - rect.left, default_height, TRUE);
2044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SendMessage(window->toolbar.toolbar, TB_AUTOSIZE, 0, 0);
2045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ShowWindow(window->toolbar.toolbar, SW_SHOW);
2046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            window->toolbar.first = 0;
2048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            window->toolbar.pos = 0;
2049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            window->toolbar.rows = 0;
2050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            window->toolbar.toolBarProc =
2051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                (WNDPROC)icvGetWindowLongPtr(window->toolbar.toolbar, CV_WNDPROC);
2052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            icvUpdateWindowPos(window);
2054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // Subclassing from toolbar
2056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            icvSetWindowLongPtr(window->toolbar.toolbar, CV_WNDPROC, HGToolbarProc);
2057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            icvSetWindowLongPtr(window->toolbar.toolbar, CV_USERDATA, window);
2058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
2059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* Retrieve current buttons count */
2061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        bcount = (int)SendMessage(window->toolbar.toolbar, TB_BUTTONCOUNT, 0, 0);
2062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if(bcount > 1)
2064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
2065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            /* If this is not the first button then we need to
2066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            separate it from the previous one */
2067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tbs.iBitmap = 0;
2068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tbs.idCommand = bcount; // Set button id to it's number
2069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tbs.iString = 0;
2070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tbs.fsStyle = TBSTYLE_SEP;
2071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            tbs.fsState = TBSTATE_ENABLED;
2072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            SendMessage(window->toolbar.toolbar, TB_ADDBUTTONS, 1, (LPARAM)&tbs);
2073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            // Retrieve current buttons count
2075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            bcount = (int)SendMessage(window->toolbar.toolbar, TB_BUTTONCOUNT, 0, 0);
2076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
2077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* Add a button which we're going to cover with the slider */
2079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tbs.iBitmap = 0;
2080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tbs.idCommand = bcount; // Set button id to it's number
2081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tbs.fsState = TBSTATE_ENABLED;
2082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if 0/*!defined WIN64 && !defined EM64T*/
2083793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tbs.fsStyle = 0;
2084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tbs.iString = 0;
2085793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
2086793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef TBSTYLE_AUTOSIZE
2088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TBSTYLE_AUTOSIZE        0x0010
2089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
2090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef TBSTYLE_GROUP
2092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define TBSTYLE_GROUP           0x0004
2093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
2094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        //tbs.fsStyle = TBSTYLE_AUTOSIZE;
2095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tbs.fsStyle = TBSTYLE_GROUP;
2096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tbs.iString = (INT_PTR)trackbar_text;
2097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
2098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SendMessage(window->toolbar.toolbar, TB_ADDBUTTONS, 1, (LPARAM)&tbs);
2099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* Adjust button size to the slider */
2101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tbis.cbSize = sizeof(tbis);
2102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tbis.dwMask = TBIF_SIZE;
2103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        GetClientRect(window->hwnd, &rect);
2105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        tbis.cx = (unsigned short)(rect.right - rect.left);
2106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SendMessage(window->toolbar.toolbar, TB_SETBUTTONINFO,
2108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            (WPARAM)tbs.idCommand, (LPARAM)&tbis);
2109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* Get button pos */
2111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SendMessage(window->toolbar.toolbar, TB_GETITEMRECT,
2112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            (WPARAM)tbs.idCommand, (LPARAM)&rect);
2113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* Create a slider */
2115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar = (CvTrackbar*)cvAlloc( sizeof(CvTrackbar) + len + 1 );
2116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->signature = CV_TRACKBAR_MAGIC_VAL;
2117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->notify = 0;
2118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->notify2 = 0;
2119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->parent = window;
2120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->pos = 0;
2121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->data = 0;
2122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->id = bcount;
2123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->next = window->toolbar.first;
2124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->name = (char*)(trackbar + 1);
2125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        memcpy( trackbar->name, trackbar_name, len + 1 );
2126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window->toolbar.first = trackbar;
2127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sprintf(slider_name, "Trackbar%p", val);
2129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->hwnd = CreateWindowEx(0, TRACKBAR_CLASS, slider_name,
2130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            WS_CHILD | WS_VISIBLE | TBS_AUTOTICKS |
2131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            TBS_FIXEDLENGTH | TBS_HORZ | TBS_BOTTOM,
2132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            rect.left + HG_BUDDY_WIDTH, rect.top,
2133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            rect.right - rect.left - HG_BUDDY_WIDTH,
2134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            rect.bottom - rect.top, window->toolbar.toolbar,
2135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            (HMENU)(size_t)bcount, hg_hinstance, 0);
2136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        sprintf(slider_name,"Buddy%p", val);
2138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->buddy = CreateWindowEx(0, "STATIC", slider_name,
2139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            WS_CHILD | SS_RIGHT,
2140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            rect.left, rect.top,
2141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            HG_BUDDY_WIDTH, rect.bottom - rect.top,
2142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            window->toolbar.toolbar, 0, hg_hinstance, 0);
2143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvSetWindowLongPtr( trackbar->hwnd, CV_USERDATA, trackbar );
2145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* Minimize the number of rows */
2147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SendMessage( window->toolbar.toolbar, TB_SETROWS,
2148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                     MAKEWPARAM(1, FALSE), (LPARAM)&rect );
2149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else
2151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->data = 0;
2153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->notify = 0;
2154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar->notify2 = 0;
2155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    trackbar->maxval = count;
2158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Adjust slider parameters */
2160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SendMessage(trackbar->hwnd, TBM_SETRANGEMIN, (WPARAM)TRUE, (LPARAM)0);
2161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SendMessage(trackbar->hwnd, TBM_SETRANGEMAX, (WPARAM)TRUE, (LPARAM)count);
2162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SendMessage(trackbar->hwnd, TBM_SETTICFREQ, (WPARAM)1, (LPARAM)0 );
2163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( val )
2164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        pos = *val;
2165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SendMessage(trackbar->hwnd, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pos );
2167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SendMessage(window->toolbar.toolbar, TB_AUTOSIZE, 0, 0);
2168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    trackbar->pos = -1;
2170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    icvUpdateTrackbar( trackbar, pos );
2171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ShowWindow( trackbar->buddy, SW_SHOW );
2172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ShowWindow( trackbar->hwnd, SW_SHOW );
2173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    trackbar->notify = on_notify;
2175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    trackbar->notify2 = on_notify2;
2176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    trackbar->userdata = userdata;
2177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    trackbar->data = val;
2178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Resize the window to reflect the toolbar resizing*/
2180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    icvUpdateWindowPos(window);
2181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result = 1;
2183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
2185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
2187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2189793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int
2190793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvCreateTrackbar( const char* trackbar_name, const char* window_name,
2191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                  int* val, int count, CvTrackbarCallback on_notify )
2192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return icvCreateTrackbar( trackbar_name, window_name, val, count,
2194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        on_notify, 0, 0 );
2195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2197793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int
2198793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvCreateTrackbar2( const char* trackbar_name, const char* window_name,
2199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                   int* val, int count, CvTrackbarCallback2 on_notify2,
2200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                   void* userdata )
2201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return icvCreateTrackbar( trackbar_name, window_name, val, count,
2203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        0, on_notify2, userdata );
2204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2206793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void
2207793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param )
2208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvSetMouseCallback" );
2210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
2212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window = 0;
2214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !window_name )
2216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL window name" );
2217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName(window_name);
2219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( !window )
2220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EXIT;
2221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->on_mouse = on_mouse;
2223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window->on_mouse_param = param;
2224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
2226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2229793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL int cvGetTrackbarPos( const char* trackbar_name, const char* window_name )
2230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int pos = -1;
2232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvGetTrackbarPos" );
2234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
2236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
2238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvTrackbar* trackbar = 0;
2239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( trackbar_name == 0 || window_name == 0 )
2241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" );
2242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( window_name );
2244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window )
2245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar = icvFindTrackbarByName( window, trackbar_name );
2246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( trackbar )
2248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        pos = trackbar->pos;
2249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
2251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return pos;
2253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2256793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos )
2257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvSetTrackbarPos" );
2259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
2261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
2263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvTrackbar* trackbar = 0;
2264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( trackbar_name == 0 || window_name == 0 )
2266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL trackbar or window name" );
2267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( window_name );
2269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window )
2270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        trackbar = icvFindTrackbarByName( window, trackbar_name );
2271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( trackbar )
2273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( pos < 0 )
2275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            pos = 0;
2276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if( pos > trackbar->maxval )
2278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            pos = trackbar->maxval;
2279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        SendMessage( trackbar->hwnd, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pos );
2281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        icvUpdateTrackbar( trackbar, pos );
2282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
2285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2288793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name, int maxval)
2289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvSetTrackbarMax" );
2291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
2293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (maxval >= 0)
2295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
2296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CvWindow* window = 0;
2297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CvTrackbar* trackbar = 0;
2298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (trackbar_name == 0 || window_name == 0)
2299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
2300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            CV_ERROR(CV_StsNullPtr, "NULL trackbar or window name");
2301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
2302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window = icvFindWindowByName(window_name);
2304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (window)
2305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        {
2306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            trackbar = icvFindTrackbarByName(window, trackbar_name);
2307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (trackbar)
2308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            {
2309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                // The position will be min(pos, maxval).
2310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                trackbar->maxval = maxval;
2311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                SendMessage(trackbar->hwnd, TBM_SETRANGEMAX, (WPARAM)TRUE, (LPARAM)maxval);
2312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
2313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
2314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
2315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
2317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2320793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void* cvGetWindowHandle( const char* window_name )
2321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    void* hwnd = 0;
2323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvGetWindowHandle" );
2325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
2327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
2329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window_name == 0 )
2331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL window name" );
2332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvFindWindowByName( window_name );
2334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window )
2335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        hwnd = (void*)window->hwnd;
2336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
2338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return hwnd;
2340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2343793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL const char* cvGetWindowName( void* window_handle )
2344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const char* window_name = "";
2346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CV_FUNCNAME( "cvGetWindowName" );
2348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __BEGIN__;
2350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    CvWindow* window;
2352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window_handle == 0 )
2354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        CV_ERROR( CV_StsNullPtr, "NULL window" );
2355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    window = icvWindowByHWND( (HWND)window_handle );
2357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if( window )
2358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        window_name = window->name;
2359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __END__;
2361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return window_name;
2363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2366793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void
2367793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvSetPreprocessFuncWin32_(const void* callback)
2368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hg_on_preprocess = (CvWin32WindowCallback)callback;
2370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2372793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerCV_IMPL void
2373793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslercvSetPostprocessFuncWin32_(const void* callback)
2374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
2375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    hg_on_postprocess = (CvWin32WindowCallback)callback;
2376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
2377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
2378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif //WIN32
2379