source: dev/trunk/ab5.0/abdev/abdev/TextEditor_EventProc.cpp

Last change on this file was 829, checked in by イグトランス (egtra), 11 years ago

svn:eol-styleとsvn:mime-type(文字コード指定含む)の設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/plain; charset=Shift_JIS
File size: 7.3 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5
6//IME関連のイベント
7void TextEditEvent_IME_StartComposition(HWND hwnd);
8BOOL TextEditEvent_IME_Composition(HWND hwnd,LPARAM lParam);
9LRESULT TextEditEvent_IME_RecomvertString(HWND hwnd,RECONVERTSTRING* prcs);
10BOOL TextEditEvent_IME_ConfirmRecomvertString(HWND hwnd,RECONVERTSTRING* prcs);
11
12//マウス関連のイベント
13void TextEditEvent_LButtonDown(HWND hwnd,POINT *pMousePos);
14void TextEditEvent_LButtonUp(HWND hwnd,POINT *pMousePos);
15void TextEditEvent_MouseMove(HWND hwnd,POINT *pMousePos);
16void TextEditEvent_LButtonDblClk(HWND hwnd,POINT *pMousePos);
17
18//キーボード関連のイベント
19void TextEditEvent_KeyUp(HWND hwnd,int nVirtualKey);
20void TextEditEvent_Char(HWND hwnd,int nVirtualKey);
21void TextEditEvent_KeyDown(HWND hwnd,int nVirtualKey,int lKeyData);
22
23
24
25HFONT hFont_TextEdit,hFont_HyperLink_TextEdit;
26int font_width,font_height;
27
28//改行時のキャレットちらつき防止用
29int hide_caret_switch;
30
31const UINT WM_IME_REQUEST = 0x0288;
32LRESULT CALLBACK TextEditProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
33    extern HANDLE hHeap;
34    extern HWND hDocCombo;
35    static DWORD dwAutoScroll;
36    extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
37    int i,WndNum;
38    SCROLLINFO si;
39    RECT rect;
40    POINT pos;
41
42    switch(message){
43        case WM_MDIACTIVATE:
44            if(!lParam) return 0;
45            i=GetWndNum((HWND)lParam);
46            if(i==-1) return 0; //ウィンドウが初期状態の場合
47
48            i=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[i]->title.c_str());
49            SendMessage(hDocCombo,CB_SETCURSEL,i,0);
50            SetStatusText(NULL);
51            ResetState_EditMenu();
52            return 0;
53
54
55
56        ///////////////////////
57        // IME関連のイベント
58        ///////////////////////
59
60        case WM_IME_STARTCOMPOSITION:
61            TextEditEvent_IME_StartComposition(hwnd);
62            //デフォルト処理を行う
63            break;
64        case WM_IME_COMPOSITION:
65            if(!TextEditEvent_IME_Composition(hwnd,lParam)) return 0;
66
67            //デフォルト処理を行う
68            break;
69        case WM_IME_REQUEST:
70            //再変換処理を行う
71            if(wParam==IMR_RECONVERTSTRING)
72                return TextEditEvent_IME_RecomvertString(hwnd,reinterpret_cast<RECONVERTSTRING*>(lParam));
73            else if (wParam==IMR_CONFIRMRECONVERTSTRING)
74                return TextEditEvent_IME_ConfirmRecomvertString(hwnd,reinterpret_cast<RECONVERTSTRING*>(lParam));
75            break;
76
77
78
79        //////////////////////////
80        // マウス関連のイベント
81        //////////////////////////
82
83        case WM_LBUTTONDOWN:
84            pos.x=LOWORD(lParam);
85            pos.y=HIWORD(lParam);
86            TextEditEvent_LButtonDown(hwnd,&pos);
87            return 0;
88        case WM_LBUTTONUP:
89            pos.x=LOWORD(lParam);
90            pos.y=HIWORD(lParam);
91            TextEditEvent_LButtonUp(hwnd,&pos);
92            return 0;
93        case WM_MOUSEMOVE:
94            pos.x=LOWORD(lParam);
95            pos.y=HIWORD(lParam);
96            TextEditEvent_MouseMove(hwnd,&pos);
97            return 0;
98        case WM_LBUTTONDBLCLK:
99            pos.x=LOWORD(lParam);
100            pos.y=HIWORD(lParam);
101            TextEditEvent_LButtonDblClk(hwnd,&pos);
102            return 0;
103        case WM_RBUTTONUP:
104            pos.x=LOWORD(lParam);
105            pos.y=HIWORD(lParam);
106            ClientToScreen(hwnd,&pos);
107
108            //ポップアップメニューを表示
109            extern HMENU hEditMenu;
110            TrackPopupMenu(hEditMenu,TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,0,hOwner,NULL);
111            return 0;
112
113
114
115        //////////////////////////////
116        // キーボード関係のイベント
117        //////////////////////////////
118
119        case WM_KEYUP:
120            TextEditEvent_KeyUp(hwnd,wParam);
121            return 0;
122        case WM_CHAR:
123            TextEditEvent_Char(hwnd,wParam);
124            return 0;
125        case WM_KEYDOWN:
126            TextEditEvent_KeyDown(hwnd,wParam,lParam);
127            return 0;
128
129
130
131        case WM_PAINT:
132            PAINTSTRUCT ps;
133            HDC hdc;
134
135            WndNum=GetWndNum(GetParent(hwnd));
136            if(WndNum==-1) return 0;
137
138            hdc=BeginPaint(hwnd,&ps);
139            TextEdit_DrawBuffer(hdc,WndNum);
140            EndPaint(hwnd,&ps);
141            ActiveBasic::IDE::Program::mainFrame.InvalidateBitmap(GetParent(hwnd));
142            return 0;
143        case WM_PRINTCLIENT:
144            WndNum=GetWndNum(GetParent(hwnd));
145            if(WndNum==-1) return 0;
146            TextEdit_DrawBuffer(reinterpret_cast<HDC>(wParam),WndNum);
147            return 0;
148        case WM_SETFOCUS:
149            WndNum=GetWndNum(GetParent(hwnd));
150            if(WndNum==-1) return 0;
151
152            //線型キャレットを作成
153            CreateCaret(hwnd,NULL,1,font_height);
154
155            //キャレットポジションを設定
156            ResetCaretPos(WndNum);
157
158            //キャレットを表示(改行の処理中のキャレットちらつきを防止の考慮に注意)
159            if(hide_caret_switch==0) ShowCaret(hwnd);
160            return 0;
161        case WM_RESETCARETPOS:
162            WndNum=GetWndNum(GetParent(hwnd));
163            ResetCaretPos(WndNum);
164            return 0;
165        case WM_KILLFOCUS:
166            HideCaret(hwnd);
167            DestroyCaret();
168            return 0;
169        case WM_MOUSEWHEEL:
170            int zDelta;
171            zDelta=GET_WHEEL_DELTA_WPARAM(wParam);
172
173            WndNum=GetWndNum(GetParent(hwnd));
174            si.cbSize=sizeof(SCROLLINFO);
175            si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
176            GetScrollInfo(hwnd,SB_VERT,&si);
177
178            UINT scrollLines;
179            SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scrollLines, 0);
180            i=zDelta*(int)scrollLines/-WHEEL_DELTA;
181
182            if(i){
183                GetClientRect(hwnd,&rect);
184                i=max(-si.nPos,min(i,si.nMax-(rect.bottom/font_height-2)-si.nPos));
185                if(i!=0){
186                    si.nPos+=i;
187                    SetScrollInfo(hwnd,SB_VERT,&si,1);
188
189                    InvalidateRect(hwnd,NULL,0);
190                }
191                ResetCaretPos(WndNum);
192            }
193            return 0;
194        case WM_SIZE:
195            WndNum=GetWndNum(GetParent(hwnd));
196            if(WndNum==-1) return 0;
197            InvalidateRect(hwnd,NULL,0);
198            return 0;
199        case WM_VSCROLL:
200            WndNum=GetWndNum(GetParent(hwnd));
201            si.cbSize=sizeof(SCROLLINFO);
202            si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
203            GetScrollInfo(hwnd,SB_VERT,&si);
204            if(LOWORD(wParam)==SB_LINEUP) i=-1;
205            else if(LOWORD(wParam)==SB_LINEDOWN) i=1;
206            else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)si.nPage;
207            else if(LOWORD(wParam)==SB_PAGEDOWN) i=si.nPage;
208            else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-si.nPos;
209            else i=0;
210            GetClientRect(hwnd,&rect);
211            i=max(-si.nPos,min(i,si.nMax-(rect.bottom/font_height-2)-si.nPos));
212            if(i!=0){
213                si.nPos+=i;
214                SetScrollInfo(hwnd,SB_VERT,&si,1);
215
216                InvalidateRect(hwnd,NULL,0);
217            }
218            ResetCaretPos(WndNum);
219            return 0;
220        case WM_HSCROLL:
221            WndNum=GetWndNum(GetParent(hwnd));
222            si.cbSize=sizeof(SCROLLINFO);
223            si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
224            GetScrollInfo(hwnd,SB_HORZ,&si);
225            if(LOWORD(wParam)==SB_LINEUP) i=-1;
226            else if(LOWORD(wParam)==SB_LINEDOWN) i=1;
227            else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)si.nPage;
228            else if(LOWORD(wParam)==SB_PAGEDOWN) i=si.nPage;
229            else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-si.nPos;
230            else i=0;
231
232            GetClientRect(hwnd,&rect);
233
234            int iControlTabSpace;
235            iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
236
237            i=max(-si.nPos,min(i,si.nMax-((rect.right-iControlTabSpace)/font_width)-si.nPos));
238            if(i!=0){
239                si.nPos+=i;
240                SetScrollInfo(hwnd,SB_HORZ,&si,1);
241
242                InvalidateRect(hwnd,NULL,0);
243            }
244            ResetCaretPos(WndNum);
245
246            //ルーラーを再描画
247            InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
248            UpdateWindow(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd);
249
250            return 0;
251        case WM_CLOSE:
252            CloseDocWindow(GetWndNum(hwnd));
253            pobj_nv->bMDIZoomed=IsZoomed(hwnd);
254            i=DefMDIChildProc(hwnd,message,wParam,lParam);
255
256            //メニュー状態を設定
257            ResetState_DocMenu();
258
259            return i;
260
261
262
263        case WM_SEARCH_TAB_CREATE:
264            HWND hOneTabWnd;
265            hOneTabWnd=CreateWindowEx(0,"OneTab","OneTab",
266                WS_CHILD|WS_VISIBLE,
267                0,0,0,0,
268                MdiInfo[wParam]->pMdiTextEdit->pobj_WebResult->hwnd,0,hInst,0);
269
270            SetWindowLongPtr(hOneTabWnd,GWLP_USERDATA,lParam);
271
272            return (LRESULT)hOneTabWnd;
273        case WM_SEARCH_TAB_CLOSE:
274            DestroyWindow((HWND)lParam);
275            return 0;
276    }
277    return DefMDIChildProc(hwnd,message,wParam,lParam);
278}
Note: See TracBrowser for help on using the repository browser.