WINEXPORT LRESULT CALLBACK CommandWindowProc( HWND hwnd, UINT msg, WPARAM w, LPARAM l ) { PAINTSTRUCT ps; HDC hdc; window_id wid; switch( msg ) { case WM_CREATE: command_window_id = hwnd; SET_WNDINFO( hwnd, (LONG_PTR)&CommandWindow ); break; case WM_SETFOCUS: /* turn on caret */ NewCursor( hwnd, EditVars.NormalCursorType ); break; case WM_KILLFOCUS: /* turn off the caret */ MyHideCaret( hwnd ); DestroyCaret(); wid = (window_id)w; if( !BAD_ID( wid ) && ( wid == root_window_id || GetWindow( wid, GW_OWNER ) == edit_container_id ) ) { /* hmmm... losing focus to one of our own windows - suicide */ if( ReadingAString ) { KeyAdd( VI_KEY( ESC ) ); } } break; case WM_KEYDOWN: if( WindowsKeyPush( w, HIWORD( l ) ) ) { return( 0 ); } break; case WM_PAINT: hdc = BeginPaint( hwnd, &ps ); FillRect( hdc, &ps.rcPaint, ColorBrush( WIN_TEXT_BACKCOLOR( &CommandWindow ) ) ); /* this will cause the command window to redraw itself in readstr.c */ KeyAdd( VI_KEY( ALT_END ) ); EndPaint( hwnd, &ps ); break; case WM_DESTROY: command_window_id = NO_WINDOW; break; } return( DefWindowProc( hwnd, msg, w, l ) ); }
static void msgString( int line_no, char *str ) { int height; RECT rect; HDC hdc; if( !AllowDisplay || BAD_ID( MessageWindow ) ) { return; } GetClientRect( MessageWindow, &rect ); height = FontHeight( WIN_FONT( &MessageBar ) ); rect.top += (line_no - 1) * height; rect.bottom = rect.top + height; hdc = TextGetDC( MessageWindow, WIN_STYLE( &MessageBar ) ); FillRect( hdc, &rect, ColorBrush( WIN_BACKCOLOR( &MessageBar ) ) ); TextReleaseDC( MessageWindow, hdc ); WriteString( MessageWindow, 0, rect.top, WIN_STYLE( &MessageBar ), str ); }
/* * drawRepeatString - draw the current repeat string */ static void drawRepeatString( void ) { int height; RECT rect; HDC hdc; if( !AllowDisplay || BAD_ID( repeat_window_id ) ) { return; } GetClientRect( repeat_window_id, &rect ); height = FontHeight( WIN_TEXT_FONT( &RepeatCountWindow ) ); rect.bottom = rect.top + height; hdc = TextGetDC( repeat_window_id, WIN_TEXT_STYLE( &RepeatCountWindow ) ); FillRect( hdc, &rect, ColorBrush( WIN_TEXT_BACKCOLOR( &RepeatCountWindow ) ) ); TextReleaseDC( repeat_window_id, hdc ); WriteString( repeat_window_id, 0, rect.top, WIN_TEXT_STYLE( &RepeatCountWindow ), repString ); } /* drawRepeatString */
vi_rc DCUpdate( void ) { vi_rc rc; int i, nlines; fcb *fcb; line *line; dc dc; bool firstLine, firstTilde; linenum line_no; int displayOffset; char *displayText; #ifdef __WIN__ HDC hdc_wnd; #ifdef BITBLT_BUFFER_DISPLAY HDC hdc_mem; HBITMAP hbitmap; type_style *ws; #endif #else bool hasMouse; unsigned int hdc_wnd = 0; #endif if( EditFlags.Quiet || CurrentInfo == NULL ) { return( ERR_NO_ERR ); } #ifdef __WIN__ MyHideCaret( CurrentWindow ); hdc_wnd = GetDC( CurrentWindow ); #ifdef BITBLT_BUFFER_DISPLAY hdc_mem = CreateCompatibleDC( hdc_wnd ); ws = &(SEType[SE_WHITESPACE]); hbitmap = CreateCompatibleBitmap( hdc_wnd, WindowAuxInfo( CurrentWindow, WIND_INFO_WIDTH ), FontHeight( ws->font ) ); SelectObject( hdc_mem, hbitmap ); SelectObject( hdc_mem, ColorBrush( ws->background ) ); #endif #else hasMouse = DisplayMouse( false ); #endif rc = CGimmeLinePtr( LeftTopPos.line, &fcb, &line ); if( rc != ERR_NO_ERR ) { return( rc ); } nlines = CurrentInfo->dc_size; dc = CurrentInfo->dc; firstLine = true; firstTilde = true; for( i = 0, line_no = LeftTopPos.line; i < nlines; i++, line_no++ ) { if( dc->display ) { if( line ) { if( firstLine ) { if( dc->valid ) { // major speedup SSInitLanguageFlagsGivenValues( &(dc->flags) ); } else { SSInitLanguageFlags( line_no ); } firstLine = false; } displayText = line->data; if( line->u.ld.nolinedata ) { if( WorkLine->len >= 0 ) { displayText = WorkLine->data; } else { displayText = "*** ERR NULL DATA ***"; } } displayOffset = VirtualLineLen( displayText ); if( displayOffset > LeftTopPos.column ) { displayOffset = LeftTopPos.column; } } else { if( EditFlags.DrawTildes ) { displayText = "~"; } else { displayText = ""; if( firstTilde ) { displayText = EditVars.FileEndString; firstTilde = false; } } displayOffset = 0; } #ifdef BITBLT_BUFFER_DISPLAY DisplayLineInWindowWithSyntaxStyle( CurrentWindow, i + 1, line, line_no, displayText, displayOffset, hdc_wnd, hdc_mem ); #else DisplayLineInWindowWithSyntaxStyle( CurrentWindow, i + 1, line, line_no, displayText, displayOffset, hdc_wnd ); #endif dc->display = false; } else { // just in case displaying 2+ blocks in one update firstLine = true; } if( line ) { rc = CGimmeNextLinePtr( &fcb, &line ); } if( rc != ERR_NO_ERR && rc != ERR_NO_MORE_LINES ) { return( rc ); } dc++; } #ifdef __WIN__ #ifdef BITBLT_BUFFER_DISPLAY DeleteDC( hdc_mem ); DeleteObject( hbitmap ); #endif ReleaseDC( CurrentWindow, hdc_wnd ); MyShowCaret( CurrentWindow ); #else DisplayMouse( hasMouse ); #endif return( ERR_NO_ERR ); }