there are a number of ways to handle it.
1. whatever graphics you're using might do it for you automatically. for example, dx9 3d scales to whatever resolution you tell it automatically, however their d3dxSprite API does not.
2. draw at a single resolution, then strecthblit the results to the desired screen size.
3. use text and blit routines that convert to the current screen size on the fly.
i tend to prefer option 3. the slick thing to do is select a graphics package, then write wrapper routines for its text and sprite routines that convert from virtual to screen coordinates. also write wrapper routines to convert mouse input from screen to virtual coordinates. choose a virtual coordinate system big enough to last you well into the future. back in the mid 90's, i chose 10000x10000 as a virtual coordinate system. so you draw text and sprites to a virtual 10000x10000 pixel screen that the wrapper routines convert to screen coordinates on the fly. once you've written your text, sprite, and mouse wrapper routines, you now have a device independent graphics API you can use for all your projects.
but of course, being lazy, i started my last few projects hard coded at 1600x900. so my wrapper routines for those projects use a virtual 1600x900 screen size, not 10000x10000. as a result, it doesn't scale up quite as nicely as 10000x10000 would.
sounds like you haven't started yet, in which case i'd advise wrapper routines and a 10000x10000 virtual screen - unless devices will exceed that in the next 5-10 years.
note that mouse input wrapper also implies touch input wrapper, joystick input wrapper, etc. IE any input that usually arrives as screen coordinates must be converted to virtual before processing.
an example:
your virtual screen is 10000x10000. you draw some text using virtual coordiates: so you say text(1000,1000,"click here!"), which draws at 1/10 screen width and 1/10 screen height from the upper left corner of the screen. then when you check input, you do something like if isin(x,y,1000,1000,2000,1500) dostuff(). where 1000,1000,2000,1500 are bounding box virtual coordinates for the click area/hotspot/button, and x,y are the mouse click point converted to virtual coordinates.
both strechblit and wrapper routines are the same basic thing, the real difference being whether you draw everything then scale, or scale everything as you draw. implementing stretchblit can sometimes be easier, depending on the graphics package in question. but wrapper routines can yield better results, as individual text and blit routines can sometimes scale more accurately and with better looking results than simply stretching the whole screen to fit. also, generally speaking, scaling down tends to look better than scaling up. and obviously, scaling as little as possible looks best.
note that with stretchblit, you'll still need wrapper routines to convert input from current screen size to whatever screen size you draw in before strectblitting. so with stretchblit, your native drawing resolution is equivalent to your virtual screen size when using wrapper routines for drawing text and sprites.