From 8bb93b8d4834faab8b2dce1bcd731669064ca6a1 Mon Sep 17 00:00:00 2001 From: dickelbeck Date: Sat, 4 Aug 2007 01:12:30 +0000 Subject: [PATCH] beautified --- pcbnew/controle.cpp | 618 +++++++++++++++++++++++--------------------- 1 file changed, 322 insertions(+), 296 deletions(-) diff --git a/pcbnew/controle.cpp b/pcbnew/controle.cpp index 951d8f9fa1..212eefe63b 100644 --- a/pcbnew/controle.cpp +++ b/pcbnew/controle.cpp @@ -1,11 +1,12 @@ - /********************************************************/ - /* Routines generales de gestion des commandes usuelles */ - /********************************************************/ +/********************************************************/ +/* Routines generales de gestion des commandes usuelles */ +/********************************************************/ /* fichier controle.cpp */ + /* - Routines d'affichage grille, Boite de coordonnees, Curseurs, marqueurs ... -*/ + * Routines d'affichage grille, Boite de coordonnees, Curseurs, marqueurs ... + */ #include "fctsys.h" #include "gr_basic.h" @@ -21,351 +22,376 @@ /* Variables Locales */ /**********************************/ -void RemoteCommand(char * cmdline) +void RemoteCommand( char* cmdline ) /**********************************/ + /* Read a remote command send by eeschema via a socket, - port KICAD_PCB_PORT_SERVICE_NUMBER (currently 4242) -*/ + * port KICAD_PCB_PORT_SERVICE_NUMBER (currently 4242) + */ { -char Line[1024]; -wxString msg; -char *idcmd, * text; -WinEDA_PcbFrame * frame = EDA_Appl->m_PcbFrame; + char Line[1024]; + wxString msg; + char* idcmd, * text; + WinEDA_PcbFrame* frame = EDA_Appl->m_PcbFrame; - strncpy(Line, cmdline, sizeof(Line) -1 ); - msg = CONV_FROM_UTF8(Line); + strncpy( Line, cmdline, sizeof(Line) - 1 ); + msg = CONV_FROM_UTF8( Line ); - idcmd = strtok(Line," \n\r"); - text = strtok(NULL," \n\r"); - if ( (idcmd == NULL) || (text == NULL) ) return; + idcmd = strtok( Line, " \n\r" ); + text = strtok( NULL, " \n\r" ); + if( (idcmd == NULL) || (text == NULL) ) + return; - if( strcmp(idcmd,"$PART:") == 0 ) - { - MODULE * Module; - msg = CONV_FROM_UTF8(text); - Module = ReturnModule(frame->m_Pcb, msg); - msg.Printf(_("Locate module %s %s"),msg.GetData(), Module ? wxT("Ok") : wxT("not found")); - frame->Affiche_Message(msg); - if ( Module ) - { - wxClientDC dc(frame->DrawPanel); - frame->DrawPanel->PrepareGraphicContext(&dc); - frame->DrawPanel->CursorOff(&dc); - frame->GetScreen()->m_Curseur = Module->m_Pos; - frame->DrawPanel->CursorOn(&dc); - } - } + if( strcmp( idcmd, "$PART:" ) == 0 ) + { + MODULE* Module; + msg = CONV_FROM_UTF8( text ); + Module = ReturnModule( frame->m_Pcb, msg ); + msg.Printf( _( "Locate module %s %s" ), msg.GetData(), + Module ? wxT( "Ok" ) : wxT( "not found" ) ); + frame->Affiche_Message( msg ); + if( Module ) + { + wxClientDC dc( frame->DrawPanel ); - if(idcmd && strcmp(idcmd,"$PIN:") == 0) - { - wxString PinName, ModName; - MODULE * Module; - D_PAD * Pad = NULL; - int netcode = -1; - PinName = CONV_FROM_UTF8(text); - text = strtok(NULL," \n\r"); - if(text && strcmp(text, "$PART:") == 0 ) text = strtok(NULL,"\n\r"); + frame->DrawPanel->PrepareGraphicContext( &dc ); + frame->DrawPanel->CursorOff( &dc ); + frame->GetScreen()->m_Curseur = Module->m_Pos; + frame->DrawPanel->CursorOn( &dc ); + } + } -wxClientDC dc(frame->DrawPanel); - frame->DrawPanel->PrepareGraphicContext(&dc); + if( idcmd && strcmp( idcmd, "$PIN:" ) == 0 ) + { + wxString PinName, ModName; + MODULE* Module; + D_PAD* Pad = NULL; + int netcode = -1; + PinName = CONV_FROM_UTF8( text ); + text = strtok( NULL, " \n\r" ); + if( text && strcmp( text, "$PART:" ) == 0 ) + text = strtok( NULL, "\n\r" ); - ModName = CONV_FROM_UTF8(text); - Module = ReturnModule(frame->m_Pcb, ModName); - if( Module ) Pad = ReturnPad(Module, PinName); - if( Pad ) netcode = Pad->m_NetCode; - if ( netcode > 0 ) - { - /* effacement surbrillance ancienne */ - if(g_HightLigt_Status) frame->Hight_Light(&dc); - g_HightLigth_NetCode = netcode; - frame->Hight_Light(&dc); - frame->DrawPanel->CursorOff(&dc); - frame->GetScreen()->m_Curseur = Pad->m_Pos; - frame->DrawPanel->CursorOn( &dc); - } + wxClientDC dc( frame->DrawPanel ); - if ( Module == NULL ) - msg.Printf( _("module %s not found"), text); - else if ( Pad == NULL ) - msg.Printf( _("Pin %s (module %s) not found"), PinName.GetData(), ModName.GetData()); - else - msg.Printf( _("Locate Pin %s (module %s)"), PinName.GetData(),ModName.GetData()); - frame->Affiche_Message(msg); - } + frame->DrawPanel->PrepareGraphicContext( &dc ); + + ModName = CONV_FROM_UTF8( text ); + Module = ReturnModule( frame->m_Pcb, ModName ); + if( Module ) + Pad = ReturnPad( Module, PinName ); + if( Pad ) + netcode = Pad->m_NetCode; + if( netcode > 0 ) + { + /* effacement surbrillance ancienne */ + if( g_HightLigt_Status ) + frame->Hight_Light( &dc ); + g_HightLigth_NetCode = netcode; + frame->Hight_Light( &dc ); + frame->DrawPanel->CursorOff( &dc ); + frame->GetScreen()->m_Curseur = Pad->m_Pos; + frame->DrawPanel->CursorOn( &dc ); + } + + if( Module == NULL ) + msg.Printf( _( "module %s not found" ), text ); + else if( Pad == NULL ) + msg.Printf( _( "Pin %s (module %s) not found" ), PinName.GetData(), ModName.GetData() ); + else + msg.Printf( _( "Locate Pin %s (module %s)" ), PinName.GetData(), ModName.GetData() ); + frame->Affiche_Message( msg ); + } } /***********************************************************************/ -EDA_BaseStruct * WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay(void) +EDA_BaseStruct* WinEDA_BasePcbFrame::PcbGeneralLocateAndDisplay( void ) /***********************************************************************/ + /* Search an item under the mouse cursor. - items are searched first on the current working layer. - if nothing found, an item will be searched without layer restriction -*/ + * items are searched first on the current working layer. + * if nothing found, an item will be searched without layer restriction + */ { -EDA_BaseStruct * item; - item = Locate(CURSEUR_OFF_GRILLE, GetScreen()->m_Active_Layer); - if ( item == NULL ) - item = Locate(CURSEUR_OFF_GRILLE, -1); - return item; + EDA_BaseStruct* item; + + item = Locate( CURSEUR_OFF_GRILLE, GetScreen()->m_Active_Layer ); + if( item == NULL ) + item = Locate( CURSEUR_OFF_GRILLE, -1 ); + return item; } /****************************************************************/ -void WinEDA_BasePcbFrame::GeneralControle(wxDC *DC, wxPoint Mouse) +void WinEDA_BasePcbFrame::GeneralControle( wxDC* DC, wxPoint Mouse ) /*****************************************************************/ { -int ll; -wxSize delta; -int zoom = GetScreen()->GetZoom(); -wxPoint curpos, oldpos; -int hotkey = 0; + int ll; + wxSize delta; + int zoom = GetScreen()->GetZoom(); + wxPoint curpos, oldpos; + int hotkey = 0; - ActiveScreen = GetScreen(); + ActiveScreen = GetScreen(); - // Save the board after the time out : -int CurrentTime = time(NULL); - if( !GetScreen()->IsModify() || GetScreen()->IsSave() ) - { /* If no change, reset the time out */ - g_SaveTime = CurrentTime; - } + // Save the board after the time out : + int CurrentTime = time( NULL ); + if( !GetScreen()->IsModify() || GetScreen()->IsSave() ) + { /* If no change, reset the time out */ + g_SaveTime = CurrentTime; + } - if ( (CurrentTime - g_SaveTime) > g_TimeOut) - { - wxString tmpFileName = GetScreen()->m_FileName; - wxString filename = g_SaveFileName + PcbExtBuffer; - bool flgmodify = GetScreen()->IsModify(); - ((WinEDA_PcbFrame*)this)->SavePcbFile(filename); - if( flgmodify ) // Set the flags m_Modify cleared by SavePcbFile() - { - GetScreen()->SetModify(); - GetScreen()->SetSave();// Set the flags m_FlagSave cleared by SetModify() - } - GetScreen()->m_FileName = tmpFileName; - SetTitle(GetScreen()->m_FileName); - } + if( (CurrentTime - g_SaveTime) > g_TimeOut ) + { + wxString tmpFileName = GetScreen()->m_FileName; + wxString filename = g_SaveFileName + PcbExtBuffer; + bool flgmodify = GetScreen()->IsModify(); + ( (WinEDA_PcbFrame*) this )->SavePcbFile( filename ); + if( flgmodify ) // Set the flags m_Modify cleared by SavePcbFile() + { + GetScreen()->SetModify(); + GetScreen()->SetSave(); // Set the flags m_FlagSave cleared by SetModify() + } + GetScreen()->m_FileName = tmpFileName; + SetTitle( GetScreen()->m_FileName ); + } - curpos = DrawPanel->CursorRealPosition(Mouse); - oldpos = GetScreen()->m_Curseur; + curpos = DrawPanel->CursorRealPosition( Mouse ); + oldpos = GetScreen()->m_Curseur; - delta.x = (int) round((double)GetScreen()->GetGrid().x / zoom); - delta.y = (int) round((double)GetScreen()->GetGrid().y / zoom); - if( delta.x <= 0 ) delta.x = 1; - if( delta.y <= 0 ) delta.y = 1; + delta.x = (int) round( (double) GetScreen()->GetGrid().x / zoom ); + delta.y = (int) round( (double) GetScreen()->GetGrid().y / zoom ); + if( delta.x <= 0 ) + delta.x = 1; + if( delta.y <= 0 ) + delta.y = 1; - switch(g_KeyPressed) - { - case WXK_NUMPAD_SUBTRACT : - case WXK_SUBTRACT : - case '-' : - ll = GetScreen()->m_Active_Layer; - if(ll > CMP_N) break; - if(ll <= CUIVRE_N) break; - if ( m_Pcb->m_BoardSettings->m_CopperLayerCount <= 1) // Single layer - ll = CUIVRE_N; - if ( ll == CMP_N ) - ll = MAX(CUIVRE_N, m_Pcb->m_BoardSettings->m_CopperLayerCount-2); - else if ( ll > CUIVRE_N) ll--; - GetScreen()->m_Active_Layer = ll; - if ( DisplayOpt.ContrastModeDisplay ) DrawPanel->Refresh(TRUE); - break ; + switch( g_KeyPressed ) + { + case WXK_NUMPAD_SUBTRACT: + case WXK_SUBTRACT: + case '-': + ll = GetScreen()->m_Active_Layer; + if( ll > CMP_N ) + break; + if( ll <= CUIVRE_N ) + break; + if( m_Pcb->m_BoardSettings->m_CopperLayerCount <= 1 ) // Single layer + ll = CUIVRE_N; + if( ll == CMP_N ) + ll = MAX( CUIVRE_N, m_Pcb->m_BoardSettings->m_CopperLayerCount - 2 ); + else if( ll > CUIVRE_N ) + ll--; + GetScreen()->m_Active_Layer = ll; + if( DisplayOpt.ContrastModeDisplay ) + DrawPanel->Refresh( TRUE ); + break; - case WXK_NUMPAD_ADD : - case WXK_ADD : - case '+' : - ll = GetScreen()->m_Active_Layer; - if(ll >= CMP_N) break; - ll++; - if ( ll >= m_Pcb->m_BoardSettings->m_CopperLayerCount-1 ) - ll = CMP_N; - if ( m_Pcb->m_BoardSettings->m_CopperLayerCount <= 1) // Single layer - ll = CUIVRE_N; - GetScreen()->m_Active_Layer = ll; - if ( DisplayOpt.ContrastModeDisplay ) DrawPanel->Refresh(TRUE); - break ; - case WXK_NUMPAD0 : - case WXK_PAGEUP : - SwitchLayer(DC, CMP_N); - break ; + case WXK_NUMPAD_ADD: + case WXK_ADD: + case '+': + ll = GetScreen()->m_Active_Layer; + if( ll >= CMP_N ) + break; + ll++; + if( ll >= m_Pcb->m_BoardSettings->m_CopperLayerCount - 1 ) + ll = CMP_N; + if( m_Pcb->m_BoardSettings->m_CopperLayerCount <= 1 ) // Single layer + ll = CUIVRE_N; + GetScreen()->m_Active_Layer = ll; + if( DisplayOpt.ContrastModeDisplay ) + DrawPanel->Refresh( TRUE ); + break; - case WXK_NUMPAD9 : - case WXK_PAGEDOWN : - SwitchLayer(DC, CUIVRE_N); - break ; - - case 'F' | GR_KB_CTRL : - case 'f' | GR_KB_CTRL: - DisplayOpt.DisplayPcbTrackFill ^= 1; DisplayOpt.DisplayPcbTrackFill &= 1 ; - GetScreen()->SetRefreshReq(); - break ; + case WXK_NUMPAD0: + case WXK_PAGEUP: + SwitchLayer( DC, CMP_N ); + break; - case ' ' : /* Mise a jour de l'origine des coord relatives */ - GetScreen()->m_O_Curseur = GetScreen()->m_Curseur; - break ; + case WXK_NUMPAD9: + case WXK_PAGEDOWN: + SwitchLayer( DC, CUIVRE_N ); + break; + + case 'F' | GR_KB_CTRL: + case 'f' | GR_KB_CTRL: + DisplayOpt.DisplayPcbTrackFill ^= 1; DisplayOpt.DisplayPcbTrackFill &= 1; + GetScreen()->SetRefreshReq(); + break; + + case ' ': /* Mise a jour de l'origine des coord relatives */ + GetScreen()->m_O_Curseur = GetScreen()->m_Curseur; + break; - case 'U' | GR_KB_CTRL : - case 'u' | GR_KB_CTRL : - g_UnitMetric = (g_UnitMetric == INCHES ) ? MILLIMETRE : INCHES; - break ; + case 'U' | GR_KB_CTRL: + case 'u' | GR_KB_CTRL: + g_UnitMetric = (g_UnitMetric == INCHES ) ? MILLIMETRE : INCHES; + break; - case EDA_PANNING_UP_KEY : - OnZoom(ID_ZOOM_PANNING_UP); - curpos = m_CurrentScreen->m_Curseur; - break; + case EDA_PANNING_UP_KEY: + OnZoom( ID_ZOOM_PANNING_UP ); + curpos = m_CurrentScreen->m_Curseur; + break; - case EDA_PANNING_DOWN_KEY : - OnZoom(ID_ZOOM_PANNING_DOWN); - curpos = m_CurrentScreen->m_Curseur; - break; + case EDA_PANNING_DOWN_KEY: + OnZoom( ID_ZOOM_PANNING_DOWN ); + curpos = m_CurrentScreen->m_Curseur; + break; - case EDA_PANNING_LEFT_KEY : - OnZoom(ID_ZOOM_PANNING_LEFT); - curpos = m_CurrentScreen->m_Curseur; - break; + case EDA_PANNING_LEFT_KEY: + OnZoom( ID_ZOOM_PANNING_LEFT ); + curpos = m_CurrentScreen->m_Curseur; + break; - case EDA_PANNING_RIGHT_KEY : - OnZoom(ID_ZOOM_PANNING_RIGHT); - curpos = m_CurrentScreen->m_Curseur; - break; + case EDA_PANNING_RIGHT_KEY: + OnZoom( ID_ZOOM_PANNING_RIGHT ); + curpos = m_CurrentScreen->m_Curseur; + break; - case WXK_F1 : - OnZoom(ID_ZOOM_PLUS_KEY); - oldpos = curpos = GetScreen()->m_Curseur; - break; + case WXK_F1: + OnZoom( ID_ZOOM_PLUS_KEY ); + oldpos = curpos = GetScreen()->m_Curseur; + break; - case WXK_F2 : - OnZoom(ID_ZOOM_MOINS_KEY); - oldpos = curpos = GetScreen()->m_Curseur; - break; + case WXK_F2: + OnZoom( ID_ZOOM_MOINS_KEY ); + oldpos = curpos = GetScreen()->m_Curseur; + break; - case WXK_F3 : - OnZoom(ID_ZOOM_REDRAW_KEY); - break; + case WXK_F3: + OnZoom( ID_ZOOM_REDRAW_KEY ); + break; - case WXK_F4 : - OnZoom(ID_ZOOM_CENTER_KEY); - oldpos = curpos = GetScreen()->m_Curseur; - break; + case WXK_F4: + OnZoom( ID_ZOOM_CENTER_KEY ); + oldpos = curpos = GetScreen()->m_Curseur; + break; - case WXK_F5 : - SwitchLayer(DC, LAYER_N_2); - break; - - case WXK_F6 : - SwitchLayer(DC, LAYER_N_3); - break; - - case WXK_F7 : - SwitchLayer(DC, LAYER_N_4); - break; - - case WXK_F8 : - SwitchLayer(DC, LAYER_N_5); - break; - - case WXK_F9 : - SwitchLayer(DC, LAYER_N_6); - break; - - case WXK_F10 : - SwitchLayer(DC, LAYER_N_7); - break; - - case WXK_NUMPAD8 : /* Deplacement curseur vers le haut */ - case WXK_UP : - Mouse.y -= delta.y; - DrawPanel->MouseTo(Mouse); - break ; + case WXK_F5: + SwitchLayer( DC, LAYER_N_2 ); + break; - case WXK_NUMPAD2: /* Deplacement curseur vers le bas */ - case WXK_DOWN: - Mouse.y += delta.y; - DrawPanel->MouseTo(Mouse); - break ; + case WXK_F6: + SwitchLayer( DC, LAYER_N_3 ); + break; - case WXK_NUMPAD4: /* Deplacement curseur vers la gauche */ - case WXK_LEFT : - Mouse.x -= delta.x; - DrawPanel->MouseTo(Mouse); - break ; + case WXK_F7: + SwitchLayer( DC, LAYER_N_4 ); + break; - case WXK_NUMPAD6: /* Deplacement curseur vers la droite */ - case WXK_RIGHT: - Mouse.x += delta.x; - DrawPanel->MouseTo(Mouse); - break ; + case WXK_F8: + SwitchLayer( DC, LAYER_N_5 ); + break; - default: hotkey = g_KeyPressed; - break; - } + case WXK_F9: + SwitchLayer( DC, LAYER_N_6 ); + break; - /* Put cursor in new position, according to the zoom keys (if any) */ - GetScreen()->m_Curseur = curpos; - - /* Put cursor on grid or a pad centre if requested - But if the tool DELETE is active the cursor is left off grid - this is better to reach items to delete off grid - */ - D_PAD * pad; - bool keep_on_grid = TRUE; - if (m_ID_current_state == ID_PCB_DELETE_ITEM_BUTT) keep_on_grid = FALSE; - /* Cursor is left off grid if no block in progress and no moving object */ - if ( GetScreen()->BlockLocate.m_State != STATE_NO_BLOCK) - keep_on_grid = TRUE; - EDA_BaseStruct *DrawStruct = GetScreen()->m_CurrentItem; - if ( DrawStruct && DrawStruct->m_Flags ) keep_on_grid = TRUE; + case WXK_F10: + SwitchLayer( DC, LAYER_N_7 ); + break; - switch ( g_MagneticPadOption ) - { - case capture_cursor_in_track_tool: - case capture_always: - pad = Locate_Any_Pad(m_Pcb,CURSEUR_OFF_GRILLE, TRUE); - if ( (m_ID_current_state != ID_TRACK_BUTT ) && - (g_MagneticPadOption == capture_cursor_in_track_tool) ) - pad = NULL; - if (keep_on_grid) - { - if (pad) // Put cursor on the pad - GetScreen()->m_Curseur = curpos = pad->m_Pos; - else // Put cursor on grid - PutOnGrid( & GetScreen()->m_Curseur); - } - break; + case WXK_NUMPAD8: /* Deplacement curseur vers le haut */ + case WXK_UP: + Mouse.y -= delta.y; + DrawPanel->MouseTo( Mouse ); + break; - case no_effect: - default: - // If we are not in delete function, put cursor on grid - if (keep_on_grid) - PutOnGrid( & GetScreen()->m_Curseur); - break; - } + case WXK_NUMPAD2: /* Deplacement curseur vers le bas */ + case WXK_DOWN: + Mouse.y += delta.y; + DrawPanel->MouseTo( Mouse ); + break; - if ( oldpos != GetScreen()->m_Curseur ) - { - curpos = GetScreen()->m_Curseur; - GetScreen()->m_Curseur = oldpos; - DrawPanel->CursorOff(DC); + case WXK_NUMPAD4: /* Deplacement curseur vers la gauche */ + case WXK_LEFT: + Mouse.x -= delta.x; + DrawPanel->MouseTo( Mouse ); + break; - GetScreen()->m_Curseur = curpos; - DrawPanel->CursorOn(DC); + case WXK_NUMPAD6: /* Deplacement curseur vers la droite */ + case WXK_RIGHT: + Mouse.x += delta.x; + DrawPanel->MouseTo( Mouse ); + break; - if(DrawPanel->ManageCurseur) - { - DrawPanel->ManageCurseur(DrawPanel, DC, TRUE); - } - } + default: + hotkey = g_KeyPressed; + break; + } - if( GetScreen()->IsRefreshReq() ) - { - RedrawActiveWindow(DC, TRUE); - } + /* Put cursor in new position, according to the zoom keys (if any) */ + GetScreen()->m_Curseur = curpos; - SetToolbars(); - Affiche_Status_Box(); /* Affichage des coord curseur */ + /* Put cursor on grid or a pad centre if requested + * But if the tool DELETE is active the cursor is left off grid + * this is better to reach items to delete off grid + */ + D_PAD* pad; + bool keep_on_grid = TRUE; + if( m_ID_current_state == ID_PCB_DELETE_ITEM_BUTT ) + keep_on_grid = FALSE; + /* Cursor is left off grid if no block in progress and no moving object */ + if( GetScreen()->BlockLocate.m_State != STATE_NO_BLOCK ) + keep_on_grid = TRUE; + EDA_BaseStruct* DrawStruct = GetScreen()->m_CurrentItem; + if( DrawStruct && DrawStruct->m_Flags ) + keep_on_grid = TRUE; - if ( hotkey ) - { - OnHotKey(DC, hotkey, NULL); - } + switch( g_MagneticPadOption ) + { + case capture_cursor_in_track_tool: + case capture_always: + pad = Locate_Any_Pad( m_Pcb, CURSEUR_OFF_GRILLE, TRUE ); + if( (m_ID_current_state != ID_TRACK_BUTT ) + && (g_MagneticPadOption == capture_cursor_in_track_tool) ) + pad = NULL; + if( keep_on_grid ) + { + if( pad ) // Put cursor on the pad + GetScreen()->m_Curseur = curpos = pad->m_Pos; + else + // Put cursor on grid + PutOnGrid( &GetScreen()->m_Curseur ); + } + break; + + case no_effect: + default: + + // If we are not in delete function, put cursor on grid + if( keep_on_grid ) + PutOnGrid( &GetScreen()->m_Curseur ); + break; + } + + if( oldpos != GetScreen()->m_Curseur ) + { + curpos = GetScreen()->m_Curseur; + GetScreen()->m_Curseur = oldpos; + DrawPanel->CursorOff( DC ); + + GetScreen()->m_Curseur = curpos; + DrawPanel->CursorOn( DC ); + + if( DrawPanel->ManageCurseur ) + { + DrawPanel->ManageCurseur( DrawPanel, DC, TRUE ); + } + } + + if( GetScreen()->IsRefreshReq() ) + { + RedrawActiveWindow( DC, TRUE ); + } + + SetToolbars(); + Affiche_Status_Box(); /* Affichage des coord curseur */ + + if( hotkey ) + { + OnHotKey( DC, hotkey, NULL ); + } }