2012-05-14 22 views
5

Dưới đây là một mã đơn giản hiển thị sự cố mà tôi đang gặp phải.không thể truy xuất chính xác tọa độ chuột sau khi định lại kích thước cửa sổ

Mục đích của mã là tạo cửa sổ 512x512 và thay đổi kích thước Y của bề mặt cấp cao nhất thành 512x (512 + 25) khi phát hiện thấy nhấp chuột trái. Khi phát hiện thấy một nhấp chuột trái khác, chúng tôi đã đặt lại kích thước thành 512x512.

Khi phát hiện sự kiện nhấp chuột trái hoặc khi phát hiện thấy, chúng tôi hiển thị (với printf()) phối hợp chuột.

hành vi Strange quan sát:

Khi tôi chạy mã, tôi nhấp chuột trái một lần, kích thước Y của những thay đổi cửa sổ, nhưng khi tôi di chuyển con chuột trong khu vực mới được tạo ra, Y-tọa độ hiển thị là bị mắc kẹt đến 511.

Thỉnh thoảng tôi không nhận được hành vi lạ này, khi đó tọa độ Y có thể lớn hơn 511. Để có được hành vi lạ, hãy nhấp chuột nhiều lần, di chuyển chuột nhanh chóng.

Để biên dịch (linux):

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

Nguồn: (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

Làm việc tốt mà không có vấn đề được mô tả khi được biên dịch bằng Visual Studio 2010 C++, trên Windows – maximus

+1

Bạn đề cập rằng bạn nhấp chuột nhiều lần trong khi di chuyển chuột nhanh chóng. Tôi tự hỏi nếu bạn đang mất các sự kiện chuột do thay đổi kích thước cửa sổ và nhấp chuột nằm ngoài khu vực cửa sổ trong giây lát hoặc một số sự kiện chuột đang bị xóa khỏi hàng đợi tin nhắn khi hàng đợi được đưa vào. rất tình huống do điều kiện chủng tộc giữa các lớp khác nhau của SDL và ứng dụng của bạn. –

+0

Xem thêm bài đăng xếp chồng lên nhau này. http://stackoverflow.com/questions/4272506/sdl-mouse-position-cropped-after-resize –

Trả lời

0

Bạn có thể thử chức năng sau để có được x và y tọa độ trong các biến oldx và oldy như

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

hoạt động trong cửa sổ.

0

Nếu bạn đang sử dụng SDL1, tôi nghĩ bạn shoud thêm video này vào mã của bạn:

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

Bây giờ vị trí chuột ở xy.

0

Ngay sau khi bạn nhấn nút chuột, nó sẽ thay đổi kích thước và sau đó in vị trí nút. Có thể cắt xén vị trí chuột sau khi cửa sổ bị cắt.

Thử thay đổi kích thước cửa sổ chỉ trên SDL_MOUSEBUTTONUP. Bằng cách này bạn in vị trí hiện tại khi chuột thực sự nhấp (SDL_MOUSEBUTTONDOWN) và sau đó thay đổi kích thước sau khi nó được phát hành.

Các vấn đề liên quan