2012-05-14 20 views
5

का आकार बदलने के बाद माउस निर्देशांक को सही ढंग से पुनर्प्राप्त नहीं किया जा सकता है नीचे एक समस्या है जो मुझे सामना कर रही समस्या दिखा रही है।विंडो

कोड का उद्देश्य 512x512 विंडो बनाना है, और बाईं ओर क्लिक होने पर इसकी शीर्ष स्तर की सतह के वाई आयाम को 512x (512 + 25) में बदलना है। जब एक और बायां क्लिक पता चला है तो हम आयामों को 512x512 पर वापस डाल देते हैं।

जब बाएं क्लिक ईवेंट का पता लगाया जाता है, या जब mouseMotionEvent पता चला है, तो हम माउस समन्वय प्रदर्शित करते हैं (printf() के साथ)।

अजीब व्यवहार देखा:

जब मैं कोड चलाने के लिए, मैं एक बार क्लिक करें छोड़ दिया है, खिड़की परिवर्तन की Y आयाम, लेकिन जब मैं नव निर्मित क्षेत्र के अंदर माउस ले जाते हैं, वाई-निर्देशांक प्रदर्शित किया जाता है 511 पर अटक गया।

कभी-कभी मुझे यह अजीब व्यवहार नहीं मिलता है, तो वाई-समन्वय 511 से बड़ा हो सकता है। अजीब व्यवहार प्राप्त करने के लिए माउस को तेज़ी से ले जाने पर कई बार बाएं क्लिक करें।

$ gcc -o test test.c `sdl-config --cflags --libs` 

स्रोत:: (test.c)

#include <stdlib.h> 
#include <stdio.h> 
#include <SDL.h> 

/* Prototypes */ 
void event_handler(void); 

/* global variables declaration */ 
SDL_Surface *screen=NULL; 


/***** MAIN FUNCTION *****/ 
int main(int argc, char** argv) 
{ 
    /* init SDL */ 
    if (SDL_Init(SDL_INIT_VIDEO) < 0) { 
     fprintf(stderr, "Erreur à l'initialisation de la SDL : %s\n", SDL_GetError()); 
     exit(EXIT_FAILURE); 
    } 

    if ((screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE)) == NULL) { 
     fprintf(stderr, "Graphic mode could not be correctly initialized : %s\n",  SDL_GetError()); 
     exit(EXIT_FAILURE); 
    } 
    SDL_WM_SetCaption("my window", NULL); 

    /* handle event & wait until quit_event is raised */ 
    event_handler();  

    /* quit & return */ 
    SDL_Quit(); 
    return EXIT_SUCCESS; 
} 


/*** Event handler ***/ 
void event_handler(void) 
{ 
    SDL_Event event; 
    int quit=0; 
    char message_is_displayed=0; 
    SDL_Rect mess_coord = {0,512,512,512+25}; //{x_start,y_start,width,height} 

    while(!quit) 
    { 
     SDL_WaitEvent(&event); 
     switch(event.type) 
     { 
      case SDL_QUIT: 
       quit = 1; 
       break; 

      case SDL_MOUSEBUTTONDOWN: 
       if (event.button.button == SDL_BUTTON_LEFT) 
       { 
        if(!message_is_displayed) 
        { 
         screen = SDL_SetVideoMode(512,512+25, 32, SDL_SWSURFACE); //change the screen size 
         SDL_FillRect(screen, &mess_coord, SDL_MapRGB(screen->format, 255, 255, 255)); // fill in white the bottom area 
        } 
        else 
        { 
         screen = SDL_SetVideoMode(512, 512, 32, SDL_SWSURFACE); 
        } 
        message_is_displayed = !message_is_displayed; 
        SDL_Flip(screen); 
       } 
       printf("mouse position: (%d,%d)\n",event.button.x, event.button.y); 
       break; 

      case SDL_MOUSEMOTION: 
       printf("mouse position: (%d,%d)\n",event.motion.x, event.motion.y); 
       break; 
     } 
    } 
} 
+1

विंडोज – maximus

+1

पर विजुअल स्टूडियो 2010 सी ++ का उपयोग करके संकलित किए गए वर्णित समस्या के बिना अच्छी तरह से काम करना, आप उल्लेख करते हैं कि माउस को तेज़ी से ले जाने के दौरान आप कई बार माउस पर क्लिक करते हैं। मैं सोच रहा हूं कि क्या आप खिड़की के आकार में परिवर्तन के कारण माउस घटनाओं को खो रहे हैं और माउस क्लिक खिड़की क्षेत्र के बाहर क्षणिक रूप से हैं या कुछ माउस घटनाओं को संदेश कतार से हटाया जा रहा है क्योंकि दूसरों को रखा जाता है। व्यवहार जो आप वर्णन कर रहे हैं एसडीएल और आपके आवेदन की विभिन्न परतों के बीच दौड़ की स्थिति के कारण बहुत परिस्थितित्मक। –

+0

यह स्टैक ओवरफ्लो पोस्टिंग भी देखें। http://stackoverflow.com/questions/4272506/sdl-mouse-position-cropped-after-resize –

उत्तर

0

आप निम्नलिखित कार्य चर oldx में x और y निर्देशांक प्राप्त करने की कोशिश कर सकते हैं और oldy

रूप

(लिनक्स) संकलन करने के लिए

int oldx,oldy;  
oldx=wherex(); 
oldy=wherey(); 

विंडोज़ में काम करता है।

0

आप SDL1 उपयोग कर रहे हैं, मैं तुम्हें अपने कोड से जोड़ें shoud लगता है:

int x, y; 
SDL_GetMouseState(&x, &y); 

अब माउस स्थिति x और y पर है।

0

जैसे ही आप माउस बटन दबाते हैं, यह आकार बदलता है और फिर बटन स्थिति प्रिंट करता है। खिड़की के फसल के बाद यह शायद माउस की स्थिति को फसल कर रहा है।

केवल SDL_MOUSEBUTTONUP पर विंडो का आकार बदलने का प्रयास करें। इस तरह जब आप वास्तव में माउस (एसडीएल_MOUSEBUTTONDOWN) क्लिक करते हैं और फिर रिलीज़ होने के बाद आकार बदलते हैं तो आप वर्तमान स्थिति प्रिंट करते हैं।