Parameters and local variables are allocated on the stack (with reference types the object lives on the heap and a variable references that is object)
The stack typically lives at the upper end of your address space and as it is used up it heads towards the bottom of the address space (i.e. towards zero)
Your process also has a heap. As you allocate memory, this heap can grow towards the upper end of your address space.
The common cause for a stack overflow is a bad recursive call. Typically, this is caused when your recursive functions do not have the correct termination condition, so it ends up calling itself forever. However, with GUI programming, it is possible to generate indirect recursion. For example, your app may be handling paint messages, and, while processing them, it calls a function that causes the system to send another paint message. Here you have explicitly called yourself, but the OS has done it.
To deal with them you'll need to examine your code. If you have got functions that call themselves then check that you've got a terminating condition. If you have then check that after calling the function you have the modified arguments, otherwise there'll be no visible change for the recursively called function.